Как хранить пользовательские объекты в NSUserDefaults

Хорошо, я немного покопался и понял свою проблему, но не знаю, как ее исправить. Я сделал пользовательский класс для хранения некоторых данных. Я делаю объекты для этого класса, и мне нужно, чтобы они длились между сессиями. Прежде чем я положил всю свою информацию вNSUserDefaults, но это не работает.

-[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '<Player: 0x3b0cc90>' of class 'Player'.

Это сообщение об ошибке, которое я получаю, когда помещаю свой пользовательский класс «Player» вNSUserDefaults, Теперь я прочитал это, по-видимому,NSUserDefaults хранит только некоторые виды информации. Так как же я получаю свои объекты вNSUSerDefaults?

Я прочитал, что должен быть способ «кодировать» мой пользовательский объект, а затем вставить его, но я не уверен, как его реализовать, помощь будет принята! Спасибо!

****РЕДАКТИРОВАТЬ****

Хорошо, поэтому я работал с кодом, приведенным ниже (спасибо!), Но у меня все еще есть некоторые проблемы. По сути, сейчас происходит сбой кода, и я не уверен, почему, потому что он не дает никаких ошибок. Возможно, мне не хватает чего-то простого, и я слишком устал, но посмотрим. Вот реализация моего пользовательского класса «Player»:

@interface Player : NSObject {
    NSString *name;
    NSNumber *life;
    //Log of player's life
}
//Getting functions, return the info
- (NSString *)name;
- (int)life;


- (id)init;

//These are the setters
- (void)setName:(NSString *)input; //string
- (void)setLife:(NSNumber *)input; //number    

@end

Файл реализации:

#import "Player.h"
@implementation Player
- (id)init {
    if (self = [super init]) {
        [self setName:@"Player Name"];
        [self setLife:[NSNumber numberWithInt:20]];
        [self setPsnCounters:[NSNumber numberWithInt:0]];
    }
    return self;
}

- (NSString *)name {return name;}
- (int)life {return [life intValue];}
- (void)setName:(NSString *)input {
    [input retain];
    if (name != nil) {
        [name release];
    }
    name = input;
}
- (void)setLife:(NSNumber *)input {
    [input retain];
    if (life != nil) {
        [life release];
    }
    life = input;
}
/* This code has been added to support encoding and decoding my objecst */

-(void)encodeWithCoder:(NSCoder *)encoder
{
    //Encode the properties of the object
    [encoder encodeObject:self.name forKey:@"name"];
    [encoder encodeObject:self.life forKey:@"life"];
}

-(id)initWithCoder:(NSCoder *)decoder
{
    self = [super init];
    if ( self != nil )
    {
        //decode the properties
        self.name = [decoder decodeObjectForKey:@"name"];
        self.life = [decoder decodeObjectForKey:@"life"];
    }
    return self;
}
-(void)dealloc {
    [name release];
    [life release];
    [super dealloc];
}
@end

Так что это мой класс, довольно прямолинейный, я знаю, что он помогает создавать мои объекты. Итак, вот соответствующие части файла AppDelegate (где я вызываю функции шифрования и дешифрования):

@class MainViewController;

@interface MagicApp201AppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    MainViewController *mainViewController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) MainViewController *mainViewController;

-(void)saveCustomObject:(Player *)obj;
-(Player *)loadCustomObjectWithKey:(NSString*)key;


@end

А затем важные части файла реализации:

    #import "MagicApp201AppDelegate.h"
    #import "MainViewController.h"
    #import "Player.h"

    @implementation MagicApp201AppDelegate


    @synthesize window;
    @synthesize mainViewController;


    - (void)applicationDidFinishLaunching:(UIApplication *)application {
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
        //First check to see if some things exist
        int startup = [prefs integerForKey:@"appHasLaunched"];
        if (startup == nil) {
//Make the single player 
        Player *singlePlayer = [[Player alloc] init];
        NSLog([[NSString alloc] initWithFormat:@"%@\n%d\n%d",[singlePlayer name], [singlePlayer life], [singlePlayer psnCounters]]); //  test
        //Encode the single player so it can be stored in UserDefaults
        id test = [MagicApp201AppDelegate new];
        [test saveCustomObject:singlePlayer];
        [test release];
}
[prefs synchronize];
}

-(void)saveCustomObject:(Player *)object
{ 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:object];
    [prefs setObject:myEncodedObject forKey:@"testing"];
}

-(Player *)loadCustomObjectWithKey:(NSString*)key
{
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    NSData *myEncodedObject = [prefs objectForKey:key ];
    Player *obj = (Player *)[NSKeyedUnarchiver unarchiveObjectWithData: myEncodedObject];
    return obj;
}

Ээээ, извините за весь код. Просто пытаюсь помочь. По сути, приложение запустится, а затем сразу же выйдет из строя. Я сузил его до части шифрования приложения, где он и падает, поэтому я делаю что-то не так, но я не уверен, что именно. Помощь будет оценена еще раз, спасибо!

(Я еще не дошел до дешифрования, так как пока не работал шифрование.)

Ответы на вопрос(7)

Ваш ответ на вопрос