NSArray lässt sich nicht in NSUserdefaults speichern - Warum und wie geht das?

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

  • NSArray lässt sich nicht in NSUserdefaults speichern - Warum und wie geht das?

    Ich habe eine Klasse mit dem Namen Person, und meine OutlineView_Controller Klasse in der diese Dargestellt wird (Outline View weil eine Personen andere unter sich geordnet hat.). Gespeichert werden alle "Ober" - Personen im NSMutablearray people. Jetzt möchte ich dieses Array in denn UserDefaults speichern. Code:

    Person.h:

    Quellcode

    1. #import <Foundation/Foundation.h>
    2. @interface Person : NSObject
    3. @property (copy) NSString *name;
    4. @property (readonly, copy) NSMutableArray *children;
    5. @property int age;
    6. -(id)initWithName:(NSString *)name age:(int)age;
    7. -(void)addChild:(Person *)p;
    8. -(void)removeChild:(Person *)p;
    9. @end
    Alles anzeigen


    Die Methode zum laden des Arrays (soll gleich beim starten des Programms in awakeFromNib aufgerufen werden.) aus dem OutlineView Controller :

    Quellcode

    1. - (void)loadPeopleArray {
    2. NSUserDefaults *defs = [NSUserDefaults standardUserDefaults];
    3. NSArray *array = [defs arrayForKey:@"peopleArray"];
    4. if (array == nil) {
    5. _people = [[NSMutableArray alloc] init];
    6. } else {
    7. _people = [[NSMutableArray alloc] initWithArray:array];
    8. }
    9. }


    Und jetzt meine Problemmethode:

    Quellcode

    1. - (IBAction)savePeople:(id)sender {
    2. NSUserDefaults *defs = [NSUserDefaults standardUserDefaults];
    3. [defs setObject:[NSArray arrayWithArray:_people] forKey:@"peopleArray"];
    4. [defs synchronize];
    5. }


    Wenn ich jetzt dem people Array Objekte (In dem fall eben Personen) hinzufüge und dann "speichern" möchte kommt folgende Fehlermeldung:

    Quellcode

    1. Attempt to set a non-property-list object (
    2. "<Person: 0x608000031720>"
    3. ) as an NSUserDefaults/CFPreferences value for key peopleArray


    Ich befürchte das liegt irgendwie daran dass das Array nur die Adressen und nicht die tatsächlichen Objekte speichert...?
    Das ein NSMutableArray nicht in denn UserDefaults gespeichert werden kann dachte ich durch [NSArray arrayWithArray:_people] umgangen zu haben, oder ist das doch nicht so leicht?
    Ich hab noch nicht so viel Erfahrung, hoffe jemand kann mir helfen.
  • LoukX schrieb:

    Geht das so wie ich es mir wünsche gar nicht?
    hm... dann muss ich mir NSCoding wohl mal anschauen...
    Gipts da gute tuts.? Und gipt es ev. auch noch andere Möglichkeiten dinge in einer Mac app zu speichern als Document und UserDefaults?


    klar geht das.
    du kannst sie einfach in eine datei speichern (format ist dabei dir überlassen: plist, json, csv, ..., was proprietäres), in eine DB (zb SQLite, was nur aus einem file besteht), oder auch mittels CoreData ;)
  • Das Hauptproblem (neben des Designfehlers) ist, dass Dir niemand gesagt hat Deine eigene Klasse müsse das NSCoding Protokoll implementieren.
    Der NS(Keyed)Archiver weiß also gar nicht, wie er Deine Person verpacken soll um sie abzuspeichern.
    «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
  • gritsch schrieb:

    Marco Feltmann schrieb:

    Das Hauptproblem (neben des Designfehlers) ist, dass Dir niemand gesagt hat Deine eigene Klasse müsse das NSCoding Protokoll implementieren.

    ach, ist das so? dann lies nochmal die erste antwort (auch von mir ;-))

    Ja. 'Niemand' bezog sich in dem Zusammenhang auf die Pre-Foren-Zeit.
    Ich zumindest bin seinerzeit über ganz genau dasselbe Problem gestolpert, weil mir weder die Subclassing Tutorials von Apple noch die Classing Chapter in Büchern gesagt haben, dass ich es implementieren muss.
    «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
  • Marco Feltmann schrieb:

    gritsch schrieb:

    Marco Feltmann schrieb:

    Das Hauptproblem (neben des Designfehlers) ist, dass Dir niemand gesagt hat Deine eigene Klasse müsse das NSCoding Protokoll implementieren.

    ach, ist das so? dann lies nochmal die erste antwort (auch von mir ;-))

    Ja. 'Niemand' bezog sich in dem Zusammenhang auf die Pre-Foren-Zeit.
    Ich zumindest bin seinerzeit über ganz genau dasselbe Problem gestolpert, weil mir weder die Subclassing Tutorials von Apple noch die Classing Chapter in Büchern gesagt haben, dass ich es implementieren muss.


    Achso, aber hier im thread wurde es ihm ja gleich erklärt ;)

    naja, montag eben... ;)