将NSMutable阵列保存到NSUserDefaults时出错

时间:2014-03-01 15:29:03

标签: ios objective-c

我正在尝试将一系列位置保存到NSUserDefaults。首先,我将CLLocationCoordinates转换为NSValues数组,使用NSUserDefaults进行保存。 到目前为止,这是我的代码:

_locationsArray = [[NSMutableArray alloc] init];
NSUInteger count = [self.locations count];
CLLocationCoordinate2D coordinates[count];
for (NSInteger i = 0; i < count; i++) {
    coordinates[i] = [(CLLocation *)self.locations[i] coordinate];
    NSValue *locationValue = [NSValue valueWithMKCoordinate:coordinates[i]];
    [_locationsArray addObject:locationValue];
}
NSLog(@"location = %@", _locationsArray);
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

[defaults setObject:totalDistance forKey:@"totalDistance"];
[defaults setObject:_locationsArray forKey:@"mapOverlay"];
// [defaults setDouble:_totalTime forKey:@"totalTime"];
[defaults setObject:avgSpeedToBeSaved forKey:@"averageSpeed"];
[defaults setObject:totalCalories forKey:@"totalCalories"];
[defaults synchronize];

但是我收到以下错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSUserDefaults setObject:forKey:]: attempt to insert non-property list object (
    "<8b4df1d9 36ab4240 d5059bbe 47825ec0>",
    "<f6dd639f 36ab4240 a2a7b7f5 49825ec0>",
    "<f6dd639f 36ab4240 a2a7b7f5 49825ec0>",
    "<20c46379 36ab4240 5ff02732 4c825ec0>",
    "<20c46379 36ab4240 5ff02732 4c825ec0>",
    "<d24c9c81 36ab4240 2bd75f9f 4e825ec0>",
    "<d24c9c81 36ab4240 2bd75f9f 4e825ec0>",
    "<d810b96c 36ab4240 f4d96401 51825ec0>",
    "<d810b96c 36ab4240 f4d96401 51825ec0>"
) for key mapOverlay'

我认为如果我将坐标转换为NSValues,他们可以保存到NSUserDefaults - 是不是这样?我还应该怎么做呢?

5 个答案:

答案 0 :(得分:0)

像错误一样说: 尝试插入非属性列表对象

enter image description here

您需要实施NSCoding协议,如果您不知道该怎么做,请检查http://sam.roon.io/archiving-objective-c-objects-with-nscoding

希望能帮到你

答案 1 :(得分:0)

为什么要将NSMutableArray保存到NSUserDefaults。这不是保存数据的正确方法。

您应该将数据保存在plist文件中。

    [_locationsArray writeToFile:path atomically:YES];

plist文件中获取所有位置

  _locationsArray=[NSMutableArray arrayWithContentsOfFile:path];

您也可以使用数据库。

答案 2 :(得分:0)

你可以做的一件事就是使用NSKeyedArchiver来设置你的数组并设置为userdefaults。当你想要使用NSKeyedUnarchiver读取相同的数据解析时。

答案 3 :(得分:0)

尝试保存值而不是对象。

[defaults setValue:(id) forKey:(NSString *)];

它有效,因为(id)基本上可以是“任何东西”,它不会崩溃。 :)

答案 4 :(得分:0)

它要求一个“属性列表对象”,它是NSDictionary / XML / Plist。尝试将其保存到字典中吗?

for (NSInteger i = 0; i < count; i++) {
    coordinates[i] = [(CLLocation *)self.locations[i] coordinate];
    NSValue *locationValue = [NSValue valueWithMKCoordinate:coordinates[i]];
    [_locationsArray addObject:locationValue];
}
NSMutableDictionary *locationsDict = @{@"locationsArray": _locationsArray};

[defaults setObject:locationsDict forKey:@"mapOverlay"];
[defaults synchronize];

如果有效,请告诉我们:)