2009-10-30 2 views
10

인코딩과 디코딩에 대해 읽었을 때가끔 사람들이 끝까지 놓치지 않을 때가 있다는 것을 알았고, 일부는 varables에서는 사용되지만 다른 것들에서는 그렇지 않은 것으로 나타났습니다. 내가 물어봐도 될까요 ...initWithCoder에서 retain을 사용합니까?

(1)이 보존의 목적은 무엇이며 필요하지 않은 이유는 무엇입니까?

(2) 보존을 사용하면 릴리스와 일치시켜야한다는 것을 암시합니까?

- (id) initWithCoder: (NSCoder *) decoder { 
    name = [[decoder decodeObjectForKey: @"CardName"] retain]; 
    email = [[decoder decodeObjectForKey: @"CardEmail"] retain]; 
} 

또는

- (id) initWithCoder: (NSCoder *) decoder { 
    name = [decoder decodeObjectForKey: @"CardName"]; 
    email = [decoder decodeObjectForKey: @"CardEmail"]; 
} 

게리

+0

대부분 디코딩 된 객체를 명시 적으로 보유하지 않는 코드 샘플은 setter 메소드를 사용하여 소유권을 주장합니다. – Chuck

답변

12

첫 번째 SNIPPIT 올바른 동작을 나타냅니다. -decodeObjectForKey: 메서드에는 단어 init, copy 또는 new이 포함되어 있지 않으므로 반환 된 개체가 주변에 머물러 있는지 여부에 대한 약속이 없으며 설정된 경우 얼마 동안 유지 될지에 대한 약속이 없습니다. 객체가 주변에 머물러있는 ivars가 필요한 경우, 디코더에서 다시 가져 오는 객체가 -retain이어야합니다. 이 -retain은 개체의 -dealloc 메서드에있는 -release과 균형을 이루어야합니다. 개체는 유지되는 초기 ivars와 함께 만들어지며 파괴 될 때 ivars를 해제합니다. 이처럼 :

- (void)dealloc { 
    [name release]; 
    [email release]; 
    [super dealloc]; 
} 

춤이 필요하지 않습니다/릴리스를 유지 :

  • 개체가 소유권을 주장 할 필요가없는 경우 가비지 컬렉션

  • 를 사용하는 경우는 이바라스. 그것은 종종 그런 경우는 아닙니다. 대리자는 일반적으로 보존되지 않지만 (보통은 보관되지 않음) assign 수정 자로 선언 된 속성도 중 하나가 아닙니다.

+0

메모리 관리 안내서 둘레에 또 다른 여행이 필요할 것입니다. 단일 NSString 인스턴스 변수가 들어있는 간단한 클래스를 할당하면 내 dealloc에서이를 릴리스해야합니까, 아니면 포함 된 인스턴스를 릴리스 할 때 릴리스 될까요? – fuzzygoat

+0

예, 인스턴스 변수가 설정되면 유지하고 더 이상 필요하지 않을 때 해제해야합니다. 메모리 관리 기사에 대한 링크 모음이있는 블로그 게시물이 있습니다. http://iamleeg.blogspot.com/2008/12/cocoa-memory-management.html –

+0

그레이엄에게 감사드립니다. , 나는 당신을 나중에 참조 할 수 있도록 블로그 게시물에 연결했습니다. 좋은 주말 보내세요. – fuzzygoat

9

당신은 또한 속성을 사용하는 사람들에 의해 그릇 인도되었을 수도 있습니다. 그것의 당신은 본 적이 가능한 것을 명하고 :

이름과 이메일은 '유지'속성으로 정의 된 경우 괜찮을 것
- (id) initWithCoder: (NSCoder *) decoder { 
    self.name = [decoder decodeObjectForKey: @"CardName"]; 
    self.email = [decoder decodeObjectForKey: @"CardEmail"]; 
} 

. 물론, initialize/dealloc 메소드에서 속성 접근자를 사용하는 것이 합법적인지/권장인지에 대한 논쟁에 들어갑니다. 일부는 그렇다고 말하고, 일부는 그렇지 않다고 말합니다. Apple은 아니지만 실제로는 내가 볼 수있는 좋은 이유.

관련 문제