2011-01-11 7 views

답변

2

올바른 방법은 두 가지 방법 모두에서 해당 설정을 해제하고 nil로 설정하는 것입니다.

  1. 당신은 메모리 경고가 발생할 수 있기 때문에 viewDidUnload에서 객체를 해제해야하고,보기가 수퍼가없는 경우 당신은 메모리를 절약하기 위해 콘센트를 해제해야합니다. 뷰가 언로드되면 프레임 워크는 viewDidLoad를 다시 발행합니다.
  2. viewDidLoad + viewDidUnload가 반드시 호출되지는 않으므로 dealloc에서 개체를 릴리스해야합니다.

마지막으로 두 가지 방법 모두에서 변수를 nil로 설정하여 두 번째 릴리스를 호출 할 수 없도록해야합니다.

+0

하지만 BAD_ACCESS가 두 방법 모두에서 객체를 릴리스 할 수 있습니까? – xger86x

+0

아니요,이 값을 nil로 설정하면됩니다. – Moszi

0

의 dealloc 부모 개체가 개체가도 해제됩니다 아이를 떼어도 이런 식으로.

+0

그런데 왜 때때로 객체가 viewDidUnload에 출시 : 난 아무것도를 해제하는 것을 잊지하기 위해이 후두둑을 사용할 수 있습니까? – xger86x

+0

메모리가 부족할 때 실행 중이므로 더 이상 사용하지 않는 시각적 인 기능을 해제하여 메모리를 절약하고 객체와 관련된 데이터를 유지합니다. – woot586

2

당신이 질문에 대한 짧은 대답 : 할당 해제()를

질문에 대한 길고 더 복잡한 대답은 모두

  1. 릴리스 viewDidUnload에서 사용하지 않는 IBOutlets(). 이 메소드는 장치의 메모리가 부족할 때 호출됩니다.
  2. 현재보기 컨트롤러가 메모리 관리를 담당하는 모든 객체를 해제하고 dealloc()에서 해제합니다. (자동 발표 된 개체는이 범주에 속하지 않습니다.)
1

loadView 및/또는 viewDidLoad의 일부로 할당 및/또는 보유 된 모든 객체는 viewDidUnload으로 릴리스되어야합니다. viewDidLoad에 할당 된 항목을 모두 해제하면 NIB를 사용하는 경우 loadView이 약간 더 세게 나타납니다. retain으로 정의 된 속성 인 IBOutletloadView의 일부로 묵시적으로 보관됩니다.

뷰는 예를 들어 UITextField있는 하위 뷰를 가지고 있고로 정의 된 속성이보기를 연결하는 경우 : A는의 수를 유지해야합니다 펜촉에서로드 그리고

@property(nonatomic, retain) IBOutlet UITextField* nameField; 

실제 텍스트 필드 +2. +1은 상위보기이기 때문에 +1하고 속성을 연결했기 때문에 +1합니다. 따라서보기 컨트롤러가 해제되거나 NIB가 다시로드 될 때까지 메모리가 해제되지 않습니다.

불행하게도 viewDidUnload은보기 컨트롤러가 할당 해제 될 때 호출되지 않습니다. 그러므로 여기에 명시된 모든 IBOutlet도 명시 적으로 배포해야합니다.

-(void)releaseOutlets { 
    // Set all outlets to nil 
} 

-(void)viewDidUnload { 
    [self releaseOutlets]; 
    [super viewDidUnload]; 
} 

-(void)dealloc { 
    [self releaseOutlets]; 
    // Release anything else. 
    [super dealloc]; 
} 
+0

하지만 BAD_ACCESS가 두 방법 모두에서 객체를 릴리스 할 수 있습니까? – xger86x

+0

xger86x : viewDidUnload에서도 nil에 대한 참조를 설정하지 않은 경우 가능합니다. – PeyloW

관련 문제