2010-02-14 2 views
20

나는 -dealloc에 ​​내 물건을 해제하는 경향이, 지금은 아이폰 OS 3.0은 그들이 말하는이 재미 -viewDidUnload 방법 소개 :viewDidUnload에서 정확히 무엇을해야합니까?

//이 어떤 기본보기의 파단을 유지 해제합니다. // 예 : self.myOutlet = nil;

보기 컨트롤러의보기가 메모리에서 시작되면 So-viewDidUnload가 호출되는 것처럼 보입니다. 그리고 뷰 컨트롤러의 메인 뷰에 서브 뷰가 첨부되어 있다면, 여기에있는 것들을 릴리즈해야만합니다 - 그러나 -dealloc에도 존재하지 않습니다?

혼란 스럽습니다. 또한, -dealloc으로 인해 뷰가 언로드 (릴리즈)됩니다. 그런 다음 다시 호출하면 -viewDidUnload가 호출됩니까?

-viewDidUnload는보기 자체가 종료되지만보기 컨트롤러가 메모리에 남아있는 경우에 해당합니다. 그리고 -dealloc은 모든 것이 휴지통으로가는 경우입니다.

아마도 누군가가 혼란을 해결할 수 있습니다.

+1

유사 항목 : http://stackoverflow.com/questions/1158788/when-should-i-lease-objects-in-voidviewdidunload-rather-than-in-dealloc –

+0

viewDidUnload는 iOS 6에서 사용되지 않습니다! – whyoz

답변

37

여기서의 의도는 하위 뷰 관리의 "균형을 유지"하는 것입니다. viewDidLoad에 생성하는 내용은 viewDidUnload으로 풀어야합니다. 이렇게하면 어디에서 무엇을 공개해야하는지 쉽게 추적 할 수 있습니다. 대부분의 경우 dealloc 메소드는 init 메소드의 대칭 이미지이며 viewDidUnloadviewDidLoad 메소드의 대칭 이미지입니다.

설명했듯이 viewDid ... 메서드는 뷰 자체가로드되거나 언로드 될 때 사용됩니다. 이것은 뷰 컨트롤러가 메모리에로드 된 상태로 유지하는 사용 패턴을 허용하지만 뷰 자체가로드 필요에 따라 언로드 할 수 있습니다

물론
init 
viewDidLoad 
viewDidUnload 
viewDidLoad 
viewDidUnload 
... 
dealloc 

, 그것은 귀하의 dealloc 방법으로 사물을 해제 다치게하지 않습니다 음, viewDidUnload에서 풀어 놓을 때 nil으로 설정하면됩니다. 아이폰 OS 3.0에서 ...

이상에서 viewDidUnload 방법은 대부분의 요구에 더 적절한 장소가 될 수 있습니다

애플의 UIViewController documentation의 메모리 관리 섹션에서 다음을 인용, 더 상세하게 설명 .

메모리 부족 경고가 발생하면 UIViewController 클래스는 나중에 다시로드하거나 다시 만들 수 있음을 알고 있으면 뷰를 제거합니다. 이 경우 viewDidUnload 메소드를 호출하여 nib 파일로로드 된 객체, viewDidLoad 메소드로 작성된 객체 및 느리게 생성 된 객체를 포함하여 뷰 계층 구조와 관련된 객체의 소유권을 양도 할 기회를 코드에 부여합니다. 런타임 및보기 계층 구조에 추가됩니다. 일반적으로보기 컨트롤러에 아울렛 (IBOutlet 키워드가 포함 된 속성 또는 원시 변수)이 포함되어 있으면 viewDidUnload 메서드를 사용하여 해당 콘센트 또는 더 이상 필요하지 않은 다른보기 관련 데이터의 소유권을 양도해야합니다.

+0

Unload 메서드가 콘센트를 nil로 설정 했으므로 viewDidUnload는 viewDidLoad의 미러가 아닙니다. –

+1

언로드하는 방법은 무엇입니까? 나는 UIViewController 문서를 들여다 보았지만 그 이름을 가진 메소드를 찾지 못했습니다. viewDidUnload를 (일반적으로) viewDidLoad의 대칭 이미지로 설명하면 메모리 관리 측면에서 의미가 있습니다. 즉, viewDidLoad에 할당, 복사 또는 유지 된 모든 것이 viewDidUnload에서 해제되어야합니다. IBOutlet은 보통 nib 파일이로드 될 때 자동으로 구성되므로 viewDidUnload를 호출하기 전에 nil로 설정되어 있어도 메모리 관점에서 영향을 미치지 않아야합니다. –

+0

맑음; 모든 IBOutlet이 nil로 설정되었을 때 viewDidUnload에서 액세스 할 수 없게되는 viewDidLoad에 객체를 할당하는 경우 문제가 발생할 가능성이 * 얼마나 될지 알 수 있습니다. 그러나 이것은 객체가 항상 릴리즈를 담당하는 메모리에 대한 포인터를 유지해야하기 때문에 나쁜 디자인을 강력하게 나타냅니다. –

3

self.view = nil 인 경우 viewDidUnload가 호출된다고 말하면 일반적으로 메모리 경고가 발생하는 경우에 발생합니다. 이 메서드에서는 .xib 또는 loadView 메서드로 쉽게 만들 수있는 mainview의 하위 뷰를 모두 릴리스해야합니다.viewDidload 또는 loadView 등에서 데이터 객체를 만들면 모든 데이터 객체를 릴리스해야합니다. 이러한 메서드는 사용자에게보기를 제공하기 위해 다시 호출되기 때문에 데이터를 쉽게 다시 만들 수 있기 때문입니다.

0

일반적으로 메모리 경고가 발생하면 viewcontroller는보기를 언로드하지만 자체는 dealloc이되지 않습니다.
쉽게 다시 만들 수있는 모든 항목은 언로드해야하지만보기 모델은 제외해야합니다.

관련 문제