2010-06-15 4 views
0

내 Row 클래스에서 나는 initWithCoder 메소드를 가지고 있으며 그 메소드에서 복원 된 모든 것이 잘 작동하지만 메소드 내에서만 작동합니다. 메서드가 호출 된 후 내 Row 클래스에있는 소리 배열을 잃어버린다. 사운드 클래스도 initWithCoder 메서드를 가지고 있으며 사운드는 잘 재생되지만 Row 클래스의 initWithCoder 메서드에서만 재생됩니다. Row 객체를 디코딩하면 사운드 배열이 완전히 사라지고 호출 할 수 없습니다.내 소리는 어디 갔지?

- (id) initWithCoder:(NSCoder *)coder { 
    ... 
    soundArray = [coder decodeObjectForKey:@"soundArray"]; 
    NSLog(@"%d",[soundArray count]); 
    return self; 
} 

로그가 정상적으로 추천 등의 수를 (이 아카이브 해제 상태)을 보여줍니다

다음은 initWithCoder 내 소스입니다. 그런 다음 내가 만든 행 객체가 할당됩니다. 결과 행 객체에는 더 이상 soundArray가 없습니다.

[NSKeyedArchiver archiveRootObject:row toFile:@"DefaultRow"]; 
... 
row = [NSKeyedUnarchiver unarchiveObjectWithFile:@"DefaultRow"]; 

이제 soundArray를 호출 할 때마다 충돌이 발생합니다.

//ERROR IS HERE 
NSLog(@"%d",[[row soundArray] count]); 

도움말 (soundArray는 NSMutableArray입니다.)

답변

2

soundArray를 initWithCoder: —으로 유지해야합니다. Apple's site에서 코코아 메모리 관리를 읽을 수 있습니다.

retain soundArray가 아니라면 소유권을 주장하지 않았으므로 나중에 dealloc이됩니다. 기본적으로 decodeObjectForKey:autoreleased 인 개체를 반환합니다.

+0

방금 ​​내 모든 문제를 해결했습니다. 감사합니다. –

+2

Dane Man : 당신에게 연결된 문서를 건너 뛰지 마십시오. 그것을 읽고 모든 것을 읽으십시오. 그것은 모든 코코아와 코코아 터치 프로그래머를위한 필수 읽기입니다. –