我正在做一名高分经理。
我加载并保存如下:
-(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但返回一个空数组,这表明序列化可能由于某种原因失败。
有什么想法吗?
由于
答案 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];
}