struct in NSMutableArray

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • struct in NSMutableArray

    Hallo und nochmals vielen dank für die hilfe.

    ich möchte struct in NSMutableArray speichern

    Quellcode

    1. typdef struct _st{
    2. NSString *sr;
    3. int in;
    4. NSDate *day;
    5. }st;
    6. NSMutableArray * arr;
    7. [arr addobject:st] //falsch bitte nicht nach machen ;)
    8. st hold;
    9. hold =[arr objectAtIndex:0];//falsch bitte nicht nach machen ;)
    10. {
    Alles anzeigen


    ich weiss das NSMutableArray nur objekte speichert, und in dem fall muss man ein pointer von struct erstellen, und das wäre meine frage, wie erstelle bitte solchen pointer?
    und umgekehrt, wie kann ich den wieder aus dem NSMutableArray als struct raus holen?

    kann jemand mir bitte dabei helfen.
    vielen Dank
    java->ObjC
  • RE: struct in NSMutableArray

    Original von salwa
    Hallo und nochmals vielen dank für die hilfe.

    ich möchte struct in NSMutableArray speichern

    Quellcode

    1. typdef struct _st{
    2. NSString *sr;
    3. int in;
    4. NSDate *day;
    5. }st;
    6. NSMutableArray * arr;
    7. [arr addobject:st] //falsch bitte nicht nach machen ;)
    8. st hold;
    9. hold =[arr objectAtIndex:0];//falsch bitte nicht nach machen ;)
    10. {
    Alles anzeigen


    ich weiss das NSMutableArray nur objekte speichert, und in dem fall muss man ein pointer von struct erstellen, und das wäre meine frage, wie erstelle bitte solchen pointer?
    und umgekehrt, wie kann ich den wieder aus dem NSMutableArray als struct raus holen?

    kann jemand mir bitte dabei helfen.
    vielen Dank


    ist die eine Richtung so
    lists.apple.com/archives/cocoa-dev/2003/Aug/msg01530.html

    wenn ja wie ist zurück
    java->ObjC
  • RE: struct in NSMutableArray

    Als erstes solltest Du prüfen, ob Du nicht besser aus Deinem Struct eine Klasse machst. Mit Deinem Beispiel-Struct bekommst Du wahrscheinlich jede Menge Probleme (Speicherverwaltung und so).

    Wenn Du ein Cocoa-Struct (z. B. CGRect) in ein Array packen möchtest, solltest Du Dir mal die Klasse NSValue anschauen.
    „Meine Komplikation hatte eine Komplikation.“
  • Man kann alle Strukturexemplare in ein Array packen, wenn man NSValue und @encoding benutzt

    Quellcode

    1. MyStruct* struct = …
    2. NSValue* instance = [NSValue value:&struct withObjCType:@encoding( MyStruct )];


    Es gibt da auch keine Speicherverwaltungsprobleme.

    Negm-Awad, Objective-C und Cocoa I, S. 300
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Original von Amin Negm-Awad
    Man kann alle Strukturexemplare in ein Array packen, wenn man NSValue und @encoding benutzt

    Quellcode

    1. MyStruct* struct = …
    2. NSValue* instance = [NSValue value:&struct withObjCType:@encoding( MyStruct )];


    Es gibt da auch keine Speicherverwaltungsprobleme.


    danke für die Antwort

    und dann

    Quellcode

    1. [arr addObject:instance];


    und die andere Richtung wäre

    Quellcode

    1. NSValue* val = [arr objectAtIndex:0];
    2. MyStruct st = [NSValue getValuel:val];


    aber das fuktioniert irgendwie nicht und "NSValue may not respond to +val" so wieso.
    ich habe das gefühl diese komische NSValue klasse nicht verstanden zu haben
    java->ObjC
  • Original von macmoonshine
    Das ist richtig. Wenn ich mir das Struct in salwas Beispiel anschaue, dann werden ihm die Komponenten sr und day noch ein bisschen Kopfzerbrechen bezüglich der Speicherverwaltung bereiten.

    Das Problem liegt aber nicht darin, dass er keine Struct ablegen kann, sondern, dass seine Struct dynamische Elemente und dann noch ohne Accessoren beinhaltet. Das wird ihm ohnehin um die Ohren fliegen, nämlich bei jeder Zuweisung. (Nichts anderes macht letztlich NSValue.)

    Deshalb habe ich auch nichts gegen deinen ersten Ratschlag einzuwenden gehabt, Klassen zu verwenden. Aber wenn er das im Griff hat, was er ohnehin haben muss, dann kann er auch gleich +value:withObjCType: verwenden.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: struct in NSMutableArray

    Original von salwa
    ich weiss das NSMutableArray nur objekte speichert, und in dem fall muss man ein pointer von struct erstellen, und das wäre meine frage, wie erstelle bitte solchen pointer?


    Objekte im Sinne von NSObject bzw. einem eigen welches den selben Aufbau hat. Ein Zeiger auf deine Struct zu biegen wird dir nix bringen. Nimm einfach eine Klasse (NSObject) und arbeite damit, es gibt BTW. keinen Grund in deinem Fall ne Struct zu nehmen.
  • RE: struct in NSMutableArray

    ich glaube ich nehme eine Klasse.

    aber es würde mich richtig freuen zu wissen:

    Quellcode

    1. wie vorhin erwähnt
    2. MyStruct* struct = …
    3. NSValue* instance = [NSValue value:&struct withObjCType:@encoding( MyStruct )];


    Quellcode

    1. [arr addObject:instance];


    wie bekomme ich bitte nun den wert von "instance" als struct aus arr raus?
    java->ObjC
  • RE: struct in NSMutableArray

    Original von salwa
    wie bekomme ich bitte nun den wert von "instance" als struct aus arr raus?


    Nach deiner (richtigen) Vorgehensweise nur ein NSValue, aber noch kein Struct.
    Wenn du dir dieses NSValue dann mal anschaust, solltest du eine gewisse Datenstruktur erkennen können. Nur die Objekte darin könnten schwierig zu händeln sein.
    Aus Ermangelung eines Mac kann ich grad nicht nachsehen, was es genau tut.

    Nimm lieber ne Klasse, so wie du es ja schon vor hast. :)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Auf die Schnelle

    Quellcode

    1. NSValue* obj;
    2. int bla = 7;
    3. const void *myVal = &bla;
    4. obj = [NSValue value:myVal withObjCType:@encode(int*)];
    5. void *p;
    6. [obj getValue:&p];

    das meintest du doch oder ??
  • Original von wolf_10de
    Auf die Schnelle

    Quellcode

    1. NSValue* obj;
    2. int bla = 7;
    3. const void *myVal = &bla;
    4. obj = [NSValue value:myVal withObjCType:@encode(int*)];
    5. void *p;
    6. [obj getValue:&p];

    das meintest du doch oder ??


    jaein. hier wird ein int angelegt, aber was ich habe ist struct bla.. das scheint nicht machbar zu sein. vielen dank für eure hilfe, ich habe jetzt meine klasse, ich bin damit nicht so zufrieden, aber das was ich momentan machen kann.

    danke
    java->ObjC
  • Original von salwa
    Original von wolf_10de
    Auf die Schnelle

    Quellcode

    1. NSValue* obj;
    2. int bla = 7;
    3. const void *myVal = &bla;
    4. obj = [NSValue value:myVal withObjCType:@encode(int*)];
    5. void *p;
    6. [obj getValue:&p];

    das meintest du doch oder ??


    jaein. hier wird ein int angelegt, aber was ich habe ist struct bla.. das scheint nicht machbar zu sein. vielen dank für eure hilfe, ich habe jetzt meine klasse, ich bin damit nicht so zufrieden, aber das was ich momentan machen kann.

    danke


    klar geht das auch mit structs - sind ja nur zeiger. ob du da int oder MyStruct hisnchreibst ist ja das selbe!
  • Ich glaube, die Funktionalität bezog sich auf:

    Quellcode

    1. MyStruct* struct = …
    2. NSValue* instance = [NSValue value:&struct withObjCType:@encoding( MyStruct )];
    3. [arr addObject:instance];
    4. void *p;
    5. [[arr objectAtIndex:0] getValue:&p];


    Damit wird dann der Zeiger so zurückgegeben, dass du damit arbeiten kannst.

    Da hättest du selbst drauf kommen können, wärest du mit den Grundlagen weit genug. :)

    Was lässt dich denn an der Klasse unzufrieden sein?

    //Gritsch war schneller.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Original von gritsch
    und wenn du keine eigene klasse erstellen willst kannst ja auch ein NSMutableDictionary verwenden ;)

    Geht aber nur, wenn die Keys nicht identisch sind!
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Ich wollte dir nur kurz das Handling von NSValue zeigen, was du speicherst spielt keine Geige (int, struct) die zeiger kannst du ziehen wie Kaugummi, im schlimmsten Fall void ;)