我试图将位置数组保存到NSUserDefaults。首先,我将CLLocationCoordinates转换为一个NSValues数组,并使用NSUserDefaults进行保存。 这是到目前为止我的代码:将NSMutable阵列保存到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的 - 是那不是这种情况?我应该怎么做呢?
阅读'NSUserDefaults'的文档。 'NSValue'不是支持的数据类型之一。 – rmaddy
相关:[为什么NSUserDefaults无法在iPhone SDK中保存NSMutableDictionary?](http://stackoverflow.com/questions/471830/why-nsuserdefaults-failed-to-save-nsmutabledictionary-in-iphone-sdk/471920#471920) –
只是想提一个可能更简单的替代方法:而不是NSValues,尝试定义一个自定义类X,该类将坐标保存为NSNumber属性。然后将X的实例添加到数组中。另一种选择是包含坐标为NSNumbers的字典数组。 – Anna