2011-05-06 8 views
2

릴리스 속성과 관련하여 iOS의 메모리 관리에 대한 여러 가지 접근 방식을 보았습니다. 동료들과 토론 한 후 찬반 양론이 머리 속에 혼란스러워졌습니다.이러한 서로 다른 dealloc 전략의 장단점은 무엇입니까?

나는 예외를 만들 때를 이해하면서 자신과 다른 사람들이 쉽게 기본 접근 방식을 선택할 수 있도록 장단점을 요약하고 싶습니다. 여기에 내가 본 3 개 유사은 다음과 같습니다 추가 할 다른 변화가있는 경우

@property (nonatomic, retain) MyObject *foo;

// Release-only. Seems to be the favored approach in Apple's sample code. 
- (void)dealloc { 
    [foo release]; 
    [super dealloc]; 
} 

// Property accessor set to nil. 
- (void)dealloc { 
    self.foo = nil; 
    [super dealloc]; 
} 

// Release, then nil. 
- (void)dealloc { 
    [foo release]; 
    foo = nil; 
    [super dealloc]; 
} 

가정, 여기에 언급 나는 작전을 편집 할 수 있습니다.

+0

+1 다소 신비한 주제/관습에 대한 좋은 질문입니다. 나는 개인적으로'dealloc' 내에서'release'를하고, viewDidUnload' 메쏘드에서 (non-IBOutlet 속성을 위해) 속성을'nil'으로 설정합니다. 이에 대한 확실한 대답이 있는지 모르겠지만 답변을 읽으 려합니다. – Stuart

답변

2

버전 (1) : 최고입니다. 각각의 다른 속성에는 유해 할 수있는 속성이 있습니다.

버전 (2) : 일반적으로 dealloc (또는 init)에서 접근자를 사용하지 않는 것이 좋습니다. 이것의 뒤에있는 추론은 객체가 찢어지는 (또는 생성되는) 과정에 있고 일관성없는 상태에 있다는 것입니다. 특히 다른 사용자가 나중에 객체가 일관성없는 상태에있을 때 호출 될 수 있다는 것을 알지 못하는 접근자를 재정의 할 수있는 라이브러리를 작성하는 경우에 특히 그렇습니다. (물론 심지어 애플은 때로는 인수가 재미를 디버깅 할 수 CGRectZero없는 경우 -[UIView setFrame:]를 호출 -[UIView initWithFrame:]이 규칙을 나누기

버전 (3). nil에 바르를 설정하면 유용한 목적을 제공하지, 실제로는 오류 마스크 수 있습니다 이 사실 이유 어렵다. 확인하려면 디버깅 할 수 있도록, 즉, myObject (3) dealloc.

FastMovingTrain* train = [[FastMoving alloc] init]; 
MyObject* myObject = [[MyObject alloc] init]; 
myObject.foo = train; 
[train release]; 
// my myObject.foo is the only thing retaining train 
... 

.... 
[myObject release]; 

// Because of version (3) dealloc if myObject 
// points to the dealloced memory this line 
// will silently fail... 
[myObject.foo applyBrakes]; 

흥미롭게도이 코드를 설정할 때 설명 할 수있는 기회를 제공하는 버전이 가정, 다음 코드 조각을 고려 변수는 nil af ter a release이 맞습니다. 코드는 다음과 같이 수정하여 더욱 탄력적으로 만들 수 있습니다.

FastMovingTrain* train = [[FastMoving alloc] init]; 
MyObject* myObject = [[MyObject alloc] init]; 
myObject.foo = train; 
[train release]; 
// my myObject.foo is the only thing retaining train 
... 

.... 
[myObject release]; 
myObject = nil; 

// This assertion will fail. 
NSAssert(myObject, @"myObject must not be nil"); 
[myObject.foo applyBrakes]; 

그냥 내 $ 0.02.

+0

나는 여기서 좀 더 정밀함을 기대했다. 예를 들어, "별로 유익하지 않습니까?"또는 "전혀 도움이되지 않습니까?" "많지 않다"면, 작은 이점이 있습니까? # 2가 나쁜 아이디어 인 것처럼 들리므로 # 1과 # 3 중 어느 것을 선택해야합니다. 이 아이디어는 프로그래머 팀이 코딩 지침을 알리는 데 사용할 수있는 객관적인 사실을 제공하는 것입니다. – clozach

+0

그게 중요한 부분이라고 생각합니다. 대답은 아무런 유익이 없으며 해로울 수도 있습니다. 나는 대답을 편집 할 것이다. – idz

+0

덧붙여서 Google Objective-C 스타일 가이드에는 http://google-styleguide.googlecode.com/svn/trunk/objcguide.xml과 같은 유용한 조언이 많이 있으며 Apple 코딩 가이드 라인과도 연결됩니다. – idz

관련 문제