2011-01-05 1 views
1

iPad 응용 프로그램을 마무리하고 있는데, 이는 내 수업의 모든 dealloc 개의 메소드를 채우는 것을 의미합니다.iOS SDK - dealloc 구현 - 먼저 하위 뷰를 해제 하시겠습니까?

내 펜촉에는 여러 가지보기가 있으며 대부분은 하위보기 (예 : UIView, UILabel 등)를 포함합니다. 부모를 공개하기 전에 하위 뷰를 릴리스해야합니까? 부모보기가 해제되면 하위보기도 해제됩니까?

샘플 :

-(void)dealloc 
{ 
    [super dealloc]; 
    [childView release]; // Do I need this if I use the next line? 
    [parentView release]; // Will this perform the line above? 
} 

모두 childViewparentView 내보기 컨트롤러의 재산입니다. 둘 다 유지되었습니다.

답변

9

(명시 적 으로든 보유 된 자산을 통해) 보유 했든 관계없이 메모리 관리를 균형을 유지해야하는 모든 것.

또한 dealloc 구현의 끝 부분에서 [super dealloc]을 호출해야합니다 (예 : 해당 시간에 수퍼 클래스 리소스를 계속 사용할 수 있기 때문에).

+0

'childView'와'parentView'는 모두 내 클래스의 속성이며, 둘 다 유지됩니다. 이 예제에서는'parentView' 전에'childView'가 릴리즈되어야합니까, 아니면 상관 없습니다? –

+0

@Evan Mulawski 미친 짓을하는 커스텀 접근자가 없으면 속성을 해제하는 순서는 중요하지 않습니다. –

+0

부모보기에는 자식보기에 대한 참조가 있어야하므로 중요하지 않습니다. 따라서 부모를위한 dealloc이 호출 될 때까지 자식은 해제되지 않고 자식에게 최종적으로 배포됩니다. – Winder

1

서브 뷰가 NIB으로 지정되었으므로 viewDidUnload 메소드에 세심한주의를 기울여야 할 수도 있습니다.

펜촉에서 자동으로 할당 된보기는 콘센트를 nil로 설정하여 암시 적으로 해제 할 수 있습니다. 예를 들면 : 당신이 할 계획처럼 명시 적으로 보유 물건에 대한 다음

- (void)viewDidUnload { 
    [super viewDidUnload]; 
    self.subviewOutletOne = nil; 
    self.subviewOutletTwo = nil; 
} 

, 당신의 dealloc 메서드에서 그들을 석방 :

- (void)dealloc { 
    [myDataArray release]; 
    [coolAnimatedImage release]; 
    [myCustomSubview release]; 
    [super dealloc]; 
} 

는 또한 LEAKS 악기를 확인해야합니다. 이것은 내장 된 누수 분석 도구를 사용하기위한 무작위 튜토리얼입니다. 다른 사람/더 나은 사람이있을 수 있습니다. 그것은 처음에는 일어나서 달릴 수 있지만 완전히 가치가 있습니다.

+0

보존 된 뷰 (명시 적 또는 암시 적)는 ** ** viewDidUnload 및 dealloc 모두에서 릴리스되어야합니다. 전자는보기 제어기가 해제되기 전에 호출 될 수 있다고 보장하지 않습니다. –

+0

당신의 말은 펜촉으로 "unfrozen"할 때'dealloc'에서 풀어야한다는 말입니까? 나는 그것에 대해 들어 본 적이 없다. – Winder

+0

http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006926-CH3-SW36의 "특별 고려 사항"섹션을 참조하십시오. 마지막 두 단락은 http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmNibObjects.html#//apple_ref/doc/uid/TP40004998-SW1 –

2

그런데 앱에서 작업을 마칠 때까지 dealloc-write를 저장하는 것은 뒤로 향하는 길입니다. 집 청소 작업처럼 보이지만 사실은 메모리를 제대로 관리 할 때까지 앱이 실제로 어떻게 수행되는지에 대해 매우 왜곡 된 시각을 갖게 될 것입니다.

이상적으로는 @synthesize 문을 쓸 때 dealloc 호출을 작성해야합니다. 즉, 클래스에 속성을 추가하고이를 유지 된 속성으로 설정하면 @synthesize 및 -release 코드를 작성합니다. 그렇게하면 메모리 관리가 기본적으로 깔끔하다는 것을 알 수 있습니다 (어쨌든 클래스 속성 수준에서). 자신감있게 코드를 작성할 수 있습니다.

+0

매우 사실입니다. 저는 헬퍼 클래스를 만들 때 속성 값이 2 ~ 3 개가 넘을 때 대개이 작업을 수행합니다. 사용자 인터페이스를 지속적으로 변경하고 컨트롤 이름을 변경할 때 지루할 수 있습니다. –