Objective c NSInteger和decodeInteger:forKey:问题
我有以下两种归档方法:Objective c NSInteger和decodeInteger:forKey:问题,objective-c,cocoa,Objective C,Cocoa,我有以下两种归档方法: - (void) encodeWithCoder: (NSCoder *) encoder { [encoder encodeObject:self.exercises forKey:@"exercises"]; [encoder encodeObject:self.title forKey:@"title"]; [encoder encodeObject:self.description forKey:@"description"];
- (void) encodeWithCoder: (NSCoder *) encoder {
[encoder encodeObject:self.exercises forKey:@"exercises"];
[encoder encodeObject:self.title forKey:@"title"];
[encoder encodeObject:self.description forKey:@"description"];
[encoder encodeInteger:self.idnum forKey:@"idnum"];
[encoder encodeInteger:self.rating forKey:@"rating"];
[encoder encodeInteger:self.frequency forKey:@"frequency"];
NSLog(@"Encoding!");
}
- (id) initWithCoder: (NSCoder *) decoder {
self.exercises = [[decoder decodeObjectForKey:@"exercises"] retain];
self.title = [[decoder decodeObjectForKey:@"title"] retain];
self.description = [[decoder decodeObjectForKey:@"description"] retain];
self.idnum = [[decoder decodeIntegerForKey:@"idnum"] retain];
self.rating = [[decoder decodeIntegerForKey:@"rating"] retain];
self.frequency = [[decoder decodeIntegerForKey:@"frequency"] retain];
NSLog(@"Decoding!");
return self;
}
和标题:
@interface Workout : NSObject{
NSMutableArray *exercises;
NSString *title;
NSString *description;
NSInteger idnum;
NSInteger rating;
NSInteger frequency;
}
- (void) encodeWithCoder: (NSCoder *) encoder;
- (id) initWithCoder: (NSCoder *) decoder;
@property(nonatomic,retain) NSMutableArray *exercises;
@property(nonatomic,retain) NSString *title;
@property(nonatomic,retain) NSString *description;
@property(nonatomic) NSInteger idnum;
@property(nonatomic) NSInteger rating;
@property(nonatomic) NSInteger frequency;
@end
这似乎很简单。encodeInteger接受一个NSInteger,我将其传递给它,DecodeIntegerWorkey返回一个NSInteger,但我得到了一个奇怪的错误:
警告:无效的接收器类型“NSInteger”
当DecodeIntegerWorkey指令被执行时,我得到了一个exec错误访问
为什么会发生这种情况?项目的部署目标是否设置为Mac OS 10.5或更高版本
NSInteger
仅在Leopard中引入,因此如果您的目标是Tiger,则需要提供NSInteger
和-解码/编码IntegerWorkey:
另外,在init方法中设置ivar时,通常应该避免使用访问器。您通常应该直接设置IVAR。发布的代码有几个问题。第一:
self.idnum = [[decoder decodeIntegerForKey:@"idnum"] retain];
该代码正在向NSInteger发送“retain”。nsinteger不是对象,它们只是标量。这是非法的。用这个代替:
self.idnum = [decoder decodeIntegerForKey:@"idnum"];
接下来,此代码:
self.exercises = [[decoder decodeObjectForKey:@"exercises"] retain];
过度保留,将导致泄漏。既然你宣布了这样的练习:
@property(nonatomic,retain) NSMutableArray *exercises;
“retain”意味着当您调用setter时,它将保留传入的值,然后再将其粘贴到“exercises”实例变量中。你在打电话给二传手之前要先保留,所以这是双重保留
您可以通过将代码更改为以下任一项来解决此问题:
exercises = [[decoder decodeObjectForKey:@"exercises"] retain];
或:
self.exercises = [decoder decodeObjectForKey:@"exercises"];