Ich <-- Noob

  • Ich <-- Noob

    Hallo Forum,
    und zwar habe ich gerade ein kleines Problem, was hier bestimmt schon tausendmal besprochen wurde. Google hat mir aber gerade nicht sonderlich geholfen.

    Ich habe nämlich einen NSMutableArray, den ich in viewDidLoad bestimme. Allerdings gibt Xcode mir in der Konsole dann (null) aus. Ich hab absolut keine Ahnung was ich falsch gemacht haben soll, denn ich habe noch einen Array, den ich genauso mach und der funktioniert auch gut.
    In meinem Headerfile habe ich das hier:

    Quellcode

    1. @interface blabla : blabla {NSMutableArray *mutableArray;}
    2. property (strong, nonatomic) NSMutableArray *mutableArray;

    (Sieht so komisch aus, weil die Codetags total verbuggt sind).
    In meinem implementation-file synthesize ich den Array dann natürlich.

    Dann ist das noch in meiner viewDidLoad:

    Quellcode

    1. NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    2. if(!mutableArray)
    3. mutableArray = [NSMutableArray new];
    4. mutableArray = [NSMutableArray arrayWithCapacity:300];
    5. //Der NSMutableArray wird mit den Daten aus den UserDefaults geladen, wenn diese leer sind, ist der Array auch leer --> NSLog
    6. mutableArray = [userDefaults objectForKey:@"KeyUserDefaults"];
    7. NSLog(@"mutableArray: %@", mutableArray);


    So und der Log unten gibt mir dann mutableArray: (null) aus. Aber eigentlich müsste es ja so sein: mutableArray: { }. Der einzige Unterschied zu dem anderen Array ist, dass dieser am Anfang einfach auf nil gesetzt wird und nicht mit noch nicht vorhandenen Daten aus den UserDefaults geladen wird. Aber das dürfte ja eigentlich keinen Unterschied machen?

    EDIT: Es lag tatsächlich daran, dass ich den Array direkt mit den UserDefaults gefüllt habe.
    Nur will ich direkt am Anfang die Daten aus den Defaults in den Array packen. Wie kann ich jetzt checken, ob die UserDefaults leer sind oder schon etwas enthalten. Wenn sie etwas enthalten, müsste es ja mit dem füllen gehen, wenn nicht lässt man es leer.

    EDITEDIT: Okay habs damit gelöst:

    Quellcode

    1. if(mutableArrayUmDatenVonNSUserDefaultsZuLadenBearbeitenUndWiederZuSpeichern != nil)
    2. {
    3. }
    4. else
    5. mutableArrayUmDatenVonNSUserDefaultsZuLadenBearbeitenUndWiederZuSpeichern = [NSMutableArray arrayWithObjects:nil];


    Sorry!! :pinch:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von johannesm ()

  • Also dein Lösungsweg wirkt ja noch verwirrender als dein problematischer Code.

    johannesm schrieb:


    C-Quellcode

    1. @interface blabla : blabla {
    2. NSMutableArray *mutableArray;
    3. }
    4. property (strong, nonatomic) NSMutableArray *mutableArray;

    C-Quellcode

    1. NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    2. if(!mutableArray)
    3. mutableArray = [NSMutableArray new];
    4. mutableArray = [NSMutableArray arrayWithCapacity:300];
    5. //Der NSMutableArray wird mit den Daten aus den UserDefaults geladen, wenn diese leer sind, ist der Array auch leer --> NSLog
    6. mutableArray = [userDefaults objectForKey:@"KeyUserDefaults"];
    7. NSLog(@"mutableArray: %@", mutableArray);


    if-Abrage: Jo, sollte greifen.
    Danach eine Zuweisung an ein leeres Array. Das führt die if-Abfrage ad absurdum.
    Zu guter Letzt liest du die Werte aus den Userdefaults. Beim ersten Start dürften diese NULL sein.

    Richtiger wäre für deine ViewDidLoad:

    C-Quellcode

    1. NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    2. mutableArray = [userDefaults objectForKey:@"KeyUserDefaults"];
    3. if(!mutableArray)
    4. mutableArray = [NSMutableArray new];
    5. NSLog(@"mutableArray: %@", mutableArray);


    Done. ;)
    «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
  • little_pixel schrieb:

    Hallo,
    ich habe es gerade nur überflogen und er verwendet sicherlich auch ARC, von dem ich keine praktische Ahnung habe.
    Aber… er verwendet ja auch gar kein Setter.


    Richtig. Das @property wäre eigentlich unnötig, da johannesm sich explizit eine Instanzvariable mit selben Namen anlegt und auf dieser arbeitet.
    Sicherlich wird das im weiteren Umfeld zu Problemen führen, dürfte im aktuellen Kontext jedoch unwesentlich sein. ARC kann das. ;)

    Denn eigentlich hat er jetzt zwei Instanzvariablen vom Typ NSMutableArray:
    mutableArray wie im Header definiert
    _mutableArray durch das Synthesize der Property

    Dass man für nach außen sichtbare Collections nur Immutables nehmen sollte ist ein weiterer Punkt, der mutmaßlich mit dem Einstieg des OP in das Thema zu tun hat.
    Immer langsam und eins nach dem Anderen. :)
    «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