2010-01-07 2 views
3
나는 다음과 같은 두 가지 보관 방법이

:NSInteger 및 decodeInteger : forKey : 문제

- (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을 받아, decodeIntegerForKey는 NSInteger 반환하지만 나는이 이상한 오류를 얻을 :

경고 : 잘못된 수신기 종류 'NSInteger'

과 decodeIntegerForKey 명령이 실행될 때, 나는 얻을 exec 나쁜 액세스.

왜 이런 일이 발생합니까?

답변

8

게시 된 코드에 몇 가지 문제가 있습니다. 첫째 :

self.idnum =  [[decoder decodeIntegerForKey:@"idnum"] retain]; 

해당 코드는 NSInteger에 'retain'을 보냅니다. NSIntegers는 객체가 아니지만 스칼라 일뿐입니다. 그것은 불법입니다. 그냥이 대신 사용

self.idnum =  [decoder decodeIntegerForKey:@"idnum"]; 

다음이 코드를 :

self.exercises = [[decoder decodeObjectForKey:@"exercises"] retain]; 

는 유지를 통해이며, 누수의 원인이됩니다. 이 같은 연습 선언 이후 "유지"그

@property(nonatomic,retain) NSMutableArray *exercises; 

당신이 세터를 호출 할 때, 그것은 "운동"인스턴스 변수에 고집하기 전에 값 전달 유지된다는 것을 의미합니다. 너는 세터를 부르기 전에 지키고있어, 그것은 두 배로 유지된다.

당신은에 두 코드를 변경하여이 문제를 해결할 수 :

exercises = [[decoder decodeObjectForKey:@"exercises"] retain]; 

또는 :

self.exercises = [decoder decodeObjectForKey:@"exercises"]; 
1

프로젝트의 배포 대상이 Mac OS 10.5 이상으로 설정되어 있습니까? 당신은 일반적으로 당신이 초기화 방법에서 인스턴스 변수를 설정할 때 접근을 사용하지 않아야합니다, 여담으로 NSInteger-decode/encodeIntegerForKey:

의 구현을 제공해야합니다 당신은 타이거를 타겟팅하는 경우 NSInteger은 레오파드에 도입되었다. 보통은 ivars를 직접 설정해야합니다.