struct in NSMutableArray

  • Original von gritsch
    Original von maya
    Original von wolf_10de

    Quellcode

    1. a= [[A alloc]init];
    2. [a initValues];


    aha super vielen vielen dank
    aber sonst alles ist richtig?


    ne, das hejt so nicht - initValues istja in B implementiert!

    ja du musst sowas wie a = new A; machen!

    in obj-c eben a = [[A alloc] init];


    Ach falsch gelesen, stimmt natürlich vor lauter A B ... ;)
  • Original von maya
    aber initValues ist eine fkt von B und nicht von A muss sie auch in A angelegt? aber die werte möchte ich gern in B erstellen..?

    (ich habe ein komisches gefühl bei diesen lächerlichen fragen..)


    wie ichs gesagt habe musst du das a (klein) in deiner instanz von B erst zuweisen bevor du die setter aufrufen kannst!

    übrigens ist initValues keien funktion sondenr eine methode ;)
  • Original von gritsch
    Original von maya
    aber initValues ist eine fkt von B und nicht von A muss sie auch in A angelegt? aber die werte möchte ich gern in B erstellen..?

    (ich habe ein komisches gefühl bei diesen lächerlichen fragen..)


    wie ichs gesagt habe musst du das a (klein) in deiner instanz von B erst zuweisen bevor du die setter aufrufen kannst!

    übrigens ist initValues keien funktion sondenr eine methode ;)


    ich kriege diese fehlermeldung

    [Session started at 2010-03-05 19:00:02 +0100.]
    objc[578]: FREED(id): message setSt: sent to freed object=0x380d890

    der aufruf ist wie

    Quellcode

    1. -(void)initClassObj{
    2. a= [[A alloc]init];
    3. [a release];
    4. }
    5. -(void)initValues{
    6. [self initClassObj];
    7. [a setSt:@"string"];
    8. }
  • Original von maya
    Original von gritsch
    Original von maya
    aber initValues ist eine fkt von B und nicht von A muss sie auch in A angelegt? aber die werte möchte ich gern in B erstellen..?

    (ich habe ein komisches gefühl bei diesen lächerlichen fragen..)


    wie ichs gesagt habe musst du das a (klein) in deiner instanz von B erst zuweisen bevor du die setter aufrufen kannst!

    übrigens ist initValues keien funktion sondenr eine methode ;)


    ich kriege diese fehlermeldung

    [Session started at 2010-03-05 19:00:02 +0100.]
    objc[578]: FREED(id): message setSt: sent to freed object=0x380d890

    der aufruf ist wie

    Quellcode

    1. -(void)initClassObj{
    2. a= [[A alloc]init];
    3. [a release];
    4. }
    5. -(void)initValues{
    6. [self initClassObj];
    7. [a setSt:@"string"];
    8. }


    Du darfst ein Objekt erst releasen wenn Du es nicht mehr brauchst
  • Original von maya

    Du darfst ein Objekt erst releasen wenn Du es nicht mehr brauchst


    so dumm kann man natürlcih auch sein. Hast du ja vollkommen recht.

    vielen dank nochmals und die welt ist wieder in ordnung


    aber actung, wenn du mehrmals das initValues aufrufst wird auch a neu erzeugt (und das alte wird zum memory-leak)
  • Mal abgesehen von den kurzen und verwirrenden Bezeichnern:
    Original von maya

    Quellcode

    1. @class A;
    2. @interface B : NSObject
    3. {
    4. A *a;
    5. }
    6. @end
    7. @implementation B
    8. -(void)initValues
    9. {
    10. [a setSt:@"string"];
    11. [a setBo:YES];
    12. [a setT:3.0];
    13. [a setI:4];
    14. }
    Alles anzeigen

    Wieso hast du in B keinen Setter für a?

    Quellcode

    1. @class Foo;
    2. @interface Bar: NSObject
    3. {
    4. Foo *foo;
    5. }
    6. @property(copy) Foo *foo;
    7. @end
    8. @implementation Bar
    9. @synthesize foo;
    10. -(void)initValues
    11. {
    12. [self setFoo:[[Foo alloc] init]];
    13. Foo* foo = [self foo];
    14. [foo setSt:@"string"];
    15. [foo setBo:YES];
    16. [foo setT:3.0];
    17. [foo setI:4];
    18. }
    Alles anzeigen


    Wenn du jetzt mehrmals initValues aufrufst, dann wird erst einmal der Setter aufgerufen.
    Der gibt zunächst das alte Objekt frei und initialisiert sich dann ein Neues (in diesem Fall mittels einer Kopie des übergebenen Parameters).
    Schon haste da keine Speicherprobleme mehr.

    Vor Objective-C2 sahen Getter und Setter im Allgemeinen so aus:

    Quellcode

    1. Foo* fooValue;
    2. - (Foo*)foo {
    3. return fooValue;
    4. }
    5. - (void)setFoo:(Foo*)foo {
    6. if( fooValue != foo) {
    7. [fooValue release];
    8. fooValue = [foo copy];
    9. }
    10. }
    Alles anzeigen


    Statt copy geht natürlich auch retain, doch das Laufzeitverhalten unterscheidet sich.
    «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 Amin Negm-Awad
    Ich weiß nicht, ob es für alle Beteiligten jetzt so sinnvoll ist, Zeile für Zeile, Fehler für Fehler durchzugehen. Es gibt Einführungsliteratur.

    Sischer gibbet dat. Aber die Dame scheint bemüht und besitzt augenscheinlich erweiterte Kenntnisse in der Programmierung.
    Ich bin zuversichtlich, dass nach Weitergabe einiger Tipps zur Erleichterung des Umstiegs in naher Zukunft Fragen auftauchen werden, die wirklich interessant und keine Grundlagenprobleme sind.
    Dann wäre es natürlich schön, die Anfängerfehler wären weg und man verstünde den Code bereits beim Lesen, zum Beispiel weil die Bezeichner aussagekräftig sind.

    Ich habe die Damen der Schöpfung jedenfalls bisher so erlebt, dass sie nur dann fragen, wenn sie wirklich nicht mehr weiter wissen. Wenn sie fragen, dann sofort irgend welche menschlichen Wesen, keine blöden Computersysteme.

    wrongspot: Dictionary? Hatte gritsch auch schon vorgeschlagen. Das ist nun wirklich der simpelste und effektivste Weg, etwas in der Art eines Structs abzubilden. Aber es ist halt kein Struct. ;)

    salwa/maya:
    (zwei Personen?)
    Wer mit Structs hantiert hat C-Kenntnisse. Wer C-Kenntnisse hat, kann sicherlich aus dem Tutorial Speicherverwaltung zu Fuß einen Nutzen ziehen. Damit sollten Probleme mit der Speicherverwaltung eigentlich der Vergangenheit angehören. :)
    «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 bin mir ziemlich sicher, dass sie in mehr als einem Tag Lesen von Tutorials mehr gelernt hätte.

    Ich bin mir aber auch ziemlich sicher, dass sie in diesem Thread überhaupt nichts verallgemeinerungsfähiges gelernt hat. Sie hat die Speicherverwaltung nicht im Griff. Dazu gibt es nun nach 2 Tagen einen Link. Für mich sind das zwei verlorene Tage.
    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"?
  • Hallo,
    ich weiss dass manche langsam genug von mir haben.. aber an manchen stellen, komme ich einfach nicht weiter, und muss jemand fragen.... bitte ich brauche wieder eure helfe.

    ich habe klasse statt struct gemacht.. classObj in NSMutableArray gespeichert.. super, aber leider kann man dieses NSMutableArray nicht in NSUserDefaults speichern, der grund war die kompination mit classObj akzeptiert NSUserDefaults nicht.
    dann habe ich versucht aus dem classObj ein NSData zu machen und in NSMutableArray, das ging, aber wieder classObj aus dem NSData war nicht so einfach und ging nicht...

    jetzt habe ich die einträge in classObj hinter einander in NSMutableArray gespeichert und dies in NSUserDefaults das geht theoretisch aber nach weile habe ich die NSMutableArray-Indizis durch einander gebracht...

    nun meine Frage ich möchte so etwas haben (ich weiss das geht so nicht ) kann man das umgehen:

    Quellcode

    1. [NSMutableArray addObject:classObj];
    2. [NSUserDefaults setObjet:NSMutableArray ForKey:@"arr"];
    3. NSMutableArray = [NSUserDefauls objectForKey:@"arr"];
    4. classObj =[NSMutableArray objectAtIndex:0];


    ich habe echt viel nach geschlagen, bevor ich meine frage gestellt habe.

    vielen Dank
    java->ObjC
  • a) So kannst du das nicht eingegeben haben, weil das bereits in Zeile 2 eine Warning auslöst.

    b) Was funktioniert nicht? Funktioniert nicht heißt, dass du eine Erwartung hast und etwas anderes passiert.

    c) NSUserDefaults sollte eigentlich nur Immutables liefern.
    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
    a) So kannst du das nicht eingegeben haben, weil das bereits in Zeile 2 eine Warning auslöst.

    b) Was funktioniert nicht? Funktioniert nicht heißt, dass du eine Erwartung hast und etwas anderes passiert.

    c) NSUserDefaults sollte eigentlich nur Immutables liefern.


    danke für die Antwort.

    a) nein, ich habe es einfach jetzt von hand angegeben und es doch zu verkürzen.
    b) fktioniert nicht ist keine beschreibung aber es ist viel zu viel um es zu beschreiben
    c) das ist ok so, aber was ich meine kann man NSUserDefaults überreden, damit es doch classObj speichert? z.B in NSData "capseln" aber es ist sooooo kompliziert.
    java->ObjC
  • Prinzipiell ist dein Ansatz schon richtig.
    Nur die Durchführung ist völlig verkehrt.

    a) Welche UserDefaults hättest du denn gern?
    (Schau mal in die Doku, gibt nicht viele, aber du musst sie angeben.)
    b) Was willst du als Parameter sichern?
    (NSMutableArray sicherlich nicht.)
    c) Wieso willst du ein Array deiner eigenen Objekte da reinwerfen?
    d) Welche anderen Möglichkeiten zum Sichern von Daten kennst du?

    Generell: 'Sinngemäß abgetippt und gekürzt' ist nicht 'das ist mein Code'.
    Alles, was nicht 'das ist mein Code' ist, ist es auch nicht wert überprüft zu werden. Schließlich weiß man nie, ob da nicht Fehler eingeflossen sind, die eigentlich gar nicht existieren.
    «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 Lucas de Vil
    Prinzipiell ist dein Ansatz schon richtig.
    Nur die Durchführung ist völlig verkehrt.

    a) Welche UserDefaults hättest du denn gern?
    (Schau mal in die Doku, gibt nicht viele, aber du musst sie angeben.)
    b) Was willst du als Parameter sichern?
    (NSMutableArray sicherlich nicht.)
    c) Wieso willst du ein Array deiner eigenen Objekte da reinwerfen?
    d) Welche anderen Möglichkeiten zum Sichern von Daten kennst du?

    Generell: 'Sinngemäß abgetippt und gekürzt' ist nicht 'das ist mein Code'.
    Alles, was nicht 'das ist mein Code' ist, ist es auch nicht wert überprüft zu werden. Schließlich weiß man nie, ob da nicht Fehler eingeflossen sind, die eigentlich gar nicht existieren.


    danke für die Anwort
    a) ach so, so etwas habe ich nicht gesehen, ich dachte NSUserDefaults ist immer gleich..??!!
    ich schaue nach..
    b)jaaaah doch . mein ziel ist: daten verschiedener Typen persistent zu speichern. z.B
    person{
    name, alter, adresse, datum
    }
    bis zu 1000 personen persistent speichern, so dass man die adresse oder datum von bestimmten Personen jeder zeit ändern kann. Und ganze am besten in einer Liste.
    c) ich habe die dieses Array aus dieser personen erstellt, aber nicht persistent und dafür war die NSUserDefaults gedacht.
    d) nicht viel, da ich aus anderem Programmierbereich komme. aber SQLite3 und NSUserDefaults aber nur kennen und nicht beherrschen. DB in java (mysql, sql,...schon alles gemacht) aber noch kein ObjC.

    >> sorry, ich habe eigentlich nicht damit gerechnet, dass jemand überhaupt antwortet

    :sick:
    java->ObjC