如何在NSUserDefault中存储自定义对象

如何在NSUserDefault中存储自定义对象

好吧,所以我已经做了一些周旋,我意识到我的问题,但我不知道如何解决它。我做了一个自定义类来保存一些数据。我为这个类创建对象,并且需要它们在会话之间持续。在我把所有信息都放进去之前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"];
    }


抱歉这么多密码。只是想帮忙。基本上,该应用程序将启动,然后立即崩溃。我已经把它缩小到了应用程序的加密部分,那是它崩溃的地方,所以我做了一些错误的事情,但我不确定是什么。再次感谢您的帮助,谢谢!

(我还没来得及解密,因为我还没有开始加密。)


慕慕森
浏览 719回答 3
3回答

慕的地6264312

在Player类中,实现以下两个方法(用与您自己的对象相关的内容替换对encodeObject的调用):-&nbsp;(void)encodeWithCoder:(NSCoder&nbsp;*)encoder&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//Encode&nbsp;properties,&nbsp;other&nbsp;class&nbsp;variables,&nbsp;etc &nbsp;&nbsp;&nbsp;&nbsp;[encoder&nbsp;encodeObject:self.question&nbsp;forKey:@"question"]; &nbsp;&nbsp;&nbsp;&nbsp;[encoder&nbsp;encodeObject:self.categoryName&nbsp;forKey:@"category"]; &nbsp;&nbsp;&nbsp;&nbsp;[encoder&nbsp;encodeObject:self.subCategoryName&nbsp;forKey:@"subcategory"];}-&nbsp;(id)initWithCoder:(NSCoder&nbsp;*)decoder&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if((self&nbsp;=&nbsp;[super&nbsp;init]))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//decode&nbsp;properties,&nbsp;other&nbsp;class&nbsp;vars &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.question&nbsp;=&nbsp;[decoder&nbsp;decodeObjectForKey:@"question"]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.categoryName&nbsp;=&nbsp;[decoder&nbsp;decodeObjectForKey:@"category"]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.subCategoryName&nbsp;=&nbsp;[decoder&nbsp;decodeObjectForKey:@"subcategory"]; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;self;}读和写NSUserDefaults:-&nbsp;(void)saveCustomObject:(MyObject&nbsp;*)object&nbsp;key:(NSString&nbsp;*)key&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;NSData&nbsp;*encodedObject&nbsp;=&nbsp;[NSKeyedArchiver&nbsp;archivedDataWithRootObject:object]; &nbsp;&nbsp;&nbsp;&nbsp;NSUserDefaults&nbsp;*defaults&nbsp;=&nbsp;[NSUserDefaults&nbsp;standardUserDefaults]; &nbsp;&nbsp;&nbsp;&nbsp;[defaults&nbsp;setObject:encodedObject&nbsp;forKey:key]; &nbsp;&nbsp;&nbsp;&nbsp;[defaults&nbsp;synchronize];}-&nbsp;(MyObject&nbsp;*)loadCustomObjectWithKey:(NSString&nbsp;*)key&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;NSUserDefaults&nbsp;*defaults&nbsp;=&nbsp;[NSUserDefaults&nbsp;standardUserDefaults]; &nbsp;&nbsp;&nbsp;&nbsp;NSData&nbsp;*encodedObject&nbsp;=&nbsp;[defaults&nbsp;objectForKey:key]; &nbsp;&nbsp;&nbsp;&nbsp;MyObject&nbsp;*object&nbsp;=&nbsp;[NSKeyedUnarchiver&nbsp;unarchiveObjectWithData:encodedObject]; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;object;}无耻地从以下地方借来的代码:在nsuserdefaults中保存类
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

iOS