2011-08-25 5 views
3

에 출시 얼마나 많은 애플 템플릿은 viewDidUnload에서이 설명을 제공합니다. 문제는 다른 모든 보유 ivar 객체입니다. 일부는 프로그래밍 방식으로 추가 된 뷰이고 일부는 데이터 모델이므로이 두 가지 방법으로 처리해야합니까? 그렇지 않다면 왜 안 되겠습니까? 이 답변 here에서 는 viewDidUnload

는 난 단지보기 관련 개체 아마 IB Outlet 비는, 올바른 견해를 유지 포함해야 =nil 문으로 viewDidUnload에 가야한다는 수집? 그런 다음 다른 모든 개체 (데이터 모델 포함)는 dealloc으로 release 문으로 이루어져야합니다. 이것은 일반적인 관행입니까?

답변

1

viewDidUnload는 현재 표시되지 않는보기 컨트롤러에 대한보기를 언로드하기위한 메모리 부족 조건의 결과로 호출됩니다. 이 시점에서 뷰 컨트롤러의 뷰 객체가 릴리즈되었습니다. 즉, viewController.view의 하위 뷰인 모든 객체가 릴리즈되었지만 아이바스에서 객체를 유지하는 경우 해당 객체는 할당 취소되지 않습니다.

뷰를 다시로드 할 때 다시 만들 개체 또는 필요한 경우 쉽게 다시 만들 수있는 개체를 릴리스해야합니다. 다음 번에 뷰를 사용할 때 NIB에서 또는 loadView를 호출하여 뷰를 다시 작성하므로 릴리스 한 모든 내용이 다시 작성됩니다.

NIB에서 뷰를 가져 오면 NIB에 지정된 모든 뷰 개체가 만들어지고 뷰 컨트롤러 뷰의 하위 뷰로 추가됩니다. IBOutlets가있는 모든 ivars는 또한 해당 하위 뷰에 연결되므로 해당 객체를 "소유"(보유하고 있음) 할 수도 있습니다. 이 ivars를 공개해야만 실제로 dealloc을 얻을 수 있습니다.

로드 뷰에서 프로그래밍 방식으로 뷰를 만들면 다음 번에 뷰가로드 될 때 loadView에서 다시 생성 될 ivars로 유지되는 객체도 해제해야합니다.

데이터 모델과 같이 viewDidLoad (또는 viewWillAppear 또는 다른 위치)에서 만드는 것과 동일합니다. 나중에 뷰를 다시로드하거나 객체가 필요할 때 "쉽게"다시 만들 수 있으면 viewDidLoad에서 릴리스해야합니다. 메모리 사용을 줄입니다. 사실 데이터 모델 같은 비 - 뷰 항목에 대해서는 대신 didReceiveMemoryWarning에서 릴리스 할 것입니다. 당신은 유지 ahve 경우

-(void)setMyOutlet:(id)newObject 
{ 
    [newObject retain];  // does nothing if newObject is nil 
    [myOutlet release];  
    myOutlet = newObject; 
} 
+0

: 세터를 사용하여 유지 속성에 nil을 할당

는 릴리스 당신이 self.myOutlet = nil을 쓸 때이 같은 것을 구현 된 setter 메소드를 호출하는 그들에게 전송됩니다 데이터 모델을 뷰 컨트롤러의 ivar로 사용하고 뷰 컨트롤러의 뷰가 언로드되는 경우이 데이터를 메모리에 유지하려는 경우 viewDidLoad는이 모델을 만드는 데 적합하지 않은 것처럼 들립니다. 당신은이 같은 상황에서 뷰 컨트롤러의 ivars 생성을위한 델리게이트 메소드를 추천하겠습니까? 또는 더 일반적으로는 Core Data를 통해 장치에 데이터를 보관할 수 있습니다. 내 문제는 데이터 모델이 웹에서 그 내용을 획득한다는 것이다. 나중에 그것을 계속 사용하려면 다른 다운로드가 필요합니다. – johnbakers

+0

웹에서 데이터를 다운로드하는 경우 일반적으로 쉽게 다시 작성할 수있는 항목을 호출하지 않습니다. 나는 그것을 공개하지 않거나, 그 크기와 구조에 따라 핵심 데이터, plist 또는 NSUserDefault 또는 SQL DB에 저장합니다. – progrmr

관련 문제