我正在尝试在NSUserDefualts中保存继承MKAnnotation类的对象。它在iOS 6中运行良好,但在iOS7中崩溃。以下是保存代码:
ParkHereAnnotation = [[catAnnotation alloc] initWithCoordinate:workingCoordinate];
ParkHereAnnotation.title = @"Your Parked Here" ;
ParkHereAnnotation.subtitle = @"";
//ParkHereAnnotation.annotationType = location;
ParkHereAnnotation.parkId = [[NSString alloc] initWithString:@"-1"];
[ParkHereAnnotation setAnnotationType:location];
[userDefaults setObject:ParkHereAnnotation forKey:@"ParkingAnnotation"];//Crashing here in iOS7 but not in iOS6.
类别: 头
标头文件
@interface catAnnotation : NSObject <MKAnnotation>
{
CLLocationCoordinate2D coordinate;
NSString *title;
NSString *subtitle;
NSString *parkId;
enum MapAnnotationType annotationType;
}
@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *subtitle;
@property (nonatomic, assign) enum MapAnnotationType annotationType;
@property (nonatomic,retain) NSString *parkId;
@end
实施
@implementation catAnnotation
@synthesize coordinate;
@synthesize title;
@synthesize subtitle;
@synthesize annotationType;
@synthesize parkId;
-(id) init
{
return self;
}
-(id) initWithCoordinate:(CLLocationCoordinate2D)inCoord
{
coordinate = inCoord;
return self;
}
@end
设置前的类对象是:
崩溃: *由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'* - [NSUserDefaults setObject:forKey:]:尝试为密钥ParkingAnnotation插入非属性列表对象' ***第一次抛出调用堆栈: (0x31576e8b 0x3b8716c7 0x31576dcd 0x31ea7c21 0x126613 0x12708f 0x126f45 0x33d3155f 0x33d314fb 0x33d314cb 0x33d1d0f3 0x33d398cd 0x33d30b0d 0x33d2bc09 0x33d00f59 0x33cff747 0x31541f27 0x315413ef 0x3153fbdf 0x314aa541 0x314aa323 0x361e12eb 0x33d611e5 0xf811d 0x3bd6aab7) libc ++ abi.dylib:以NSException类型的未捕获异常终止
答案 0 :(得分:3)
您的模型类不是属性列表内容。在userdefault中,您只能保存plist内容,如string,bool,dict,array等。要保存自定义对象,您需要编写编码器/编码器方法,如:(示例)
-(void)encodeWithCoder:(NSCoder*)coder
{
[coder encodeObject:_title];
[coder encodeObject:_album];
[coder encodeObject:_pathURL];
[coder encodeObject:_daysOfGoal];
[coder encodeObject:_numberOfTimesPlayed];
[coder encodeObject:_infoString];
[coder encodeObject:_duration];
[coder encodeObject:_numberOfTimesPlayed];
[coder encodeObject:_dosage];
[coder encodeObject:_creationDate];
[coder encodeObject:_type];
[coder encodeBool:_isAutosuggestion forKey:@"isAutosuggestion"];
}
- (id)initWithCoder:(NSCoder *)coder
{
self = [super init];
if(self)
{
[self setTitle:[coder decodeObject]];
[self setAlbum:[coder decodeObject]];
[self setPathURL:[coder decodeObject]];
[self setDaysOfGoal:[coder decodeObject]];
[self setNumberOfTimesPlayed:[coder decodeObject]];
[self setInfoString:[coder decodeObject]];
[self setDuration:[coder decodeObject]];
[self setNumberOfTimesPlayed:[coder decodeObject]];
[self setDuration:[coder decodeObject]];
[self setDosage:[coder decodeObject]];
[self setCreationDate:[coder decodeObject]];
[self setIsAutosuggestion:[coder decodeBoolForKey:@"isAutosuggestion"]];
}
return self;
}
您需要添加这些方法以保存在userdefault中。
答案 1 :(得分:1)
在iOS7中,您无法在NSUserDefaults中存储类对象,您必须在保存到NSuserDefaults之前将类转换为字典,数组或数据。 NSUserDefault实际上是一个plist,它将所有数据存储在Library文件夹中。因此,如果您想要保存其中的任何内容,则必须遵循属性列表类型。