NSArray未保存在NSUserDefaults中

时间:2013-11-16 02:07:26

标签: ios cocoa-touch nsuserdefaults

我正在做一名高分经理。

我加载并保存如下:

-(void)load
{
    NSMutableArray* scores = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:HIGH_SCORE_KEY]];

    if(scores == nil)
    {
        highscores = [NSMutableArray array];
    }
    else
    {
        highscores = scores;
    }
}


-(void)save
{
    [[NSUserDefaults standardUserDefaults] setObject:highscores forKey:HIGH_SCORE_KEY];
}

我正在存储HighScore对象:

#import <Foundation/Foundation.h>

@interface HighScore : NSObject
{
    int score;
    NSString* name;
}

-(int)score;
-(NSString*)name;
-(id)init;
-(id)initWithName:(NSString*)playerName andScore:(int)playerScore; 
-(BOOL)isEqual:(id)object;
-(BOOL)isLessThan:(id)object;
@end

这门课没有什么特别复杂的。但是,当我加载时,加载不返回nil但返回一个空数组,这表明序列化可能由于某种原因失败。

有什么想法吗?

由于

1 个答案:

答案 0 :(得分:-1)

NSUserDefaults始终返回不可变对象,即使原始对象是可变的。它位于objectForKey的文档中:

返回的对象是不可变的,即使您最初设置的值是可变的。

在修改返回对象之前,需要使用[NSMutableArray arrayWithArray:]

创建返回对象的副本

如果您正在检索数组,也可以最好使用NSUserDefaults的arrayForKey方法。文档:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html

您只能在NSUserDefaults中存储对象。 所以你必须将数组转换为NSArray。但是,NSArrays也只存储对象,因此你需要存储封装在NSNumber对象中的长值:

//saving
NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *arrayObj = [[NSMutableArray alloc] init];

long *arr;
arr = new long [10];

for(int i = 0 ; i<10 ; i++) {
    [arrayObj addObject:[NSNumber numberWithLong:arr[i]]];
}

[standardDefaults setObject:arrayObj forKey:@"longArray"];
[arrayObj release];


//reading
NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults];
NSArray *arrayObj = [standardDefaults objectForKey:@"longArray"];

long *arr;
arr = new long [10];

for(int i = 0 ; i<10 ; i++) {
    arr[i] = [(NSNumber*)[arrayObj objectAtIndex:i] longValue];
}