Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSInteger和decodeInteger:forKey:问题_Objective C_Cocoa - Fatal编程技术网

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"];