2009-10-23 1 views
1

나는 UIViewController에 관한 몇 가지 질문을 가지고있다 :몇 가지 질문 : UIViewController의 수명주기; 출시 대 설정을 무효로

1) 각각의 방법은 UIViewController에 대한 호출은 언제입니까? 특히, viewDidLoad, viewDidUnload 및 dealloc의 차이점.

2) 차이점은 무엇입니까? 은 일반적으로입니다. 포인터를 nil과 같게 설정하고 포인터를 놓을 때? viewDidUnload에서 dealloc 호출 릴리즈에서는 nil과 동일하게 설정해야한다는 것을 알고 있습니다.

업데이트 : 죄송합니다. 질문에 오해의 소지가 있음을 깨달았습니다. dealloc 대신 initWithNibName : bundle : 및 release가 호출되는 시점을 의미합니까? IB에 의해 한 번만, 맞습니까?

답변

1

포인터를 nil로 설정해도 포인터가 가리키는 메모리가 해제되지 않습니다.

당신이

self.pointer = nil; 

같은 일을 할 때 일반적으로 속성은 유지 속성이있는 경우입니다. 보기를로드 할 때 이런 경우, 전무로 속성을 설정하는 것은 간접적으로 뷰 컨트롤러 방법의 경우에는

[pointer release]; 
pointer = nil; 

의 원인이됩니다, viewDidLoad에이 중 하나 펜촉에서, 또는 프로그래밍 방식으로 호출됩니다. 좀 더 구체적으로, -loadView가 호출 된 직후에 호출됩니다. loadView를 수동으로 호출 할 필요는 없습니다. 시스템이이를 수행합니다. viewDidUnload 메서드는 메모리 경고가 발생하고 뷰 컨트롤러의 뷰가 화면 상에 나타나지 않을 때 호출됩니다. 결과적으로 loadView 및 viewDidLoad가 필요할 때 다시 호출됩니다. 개체의 유지 카운트가 다양한 방법이 호출 될 때 볼 수 0

+0

죄송합니다. nil로 설정하고 릴리스를 호출하는 것의 차이점을 제외한 모든 것을 이해합니다. 결국, 당신이 그것을하는 방식에 상관없이 당신은 그것을 릴리즈하지 않습니까? 그렇다면 왜 self.pointer = nil이고 [pointer release]가 아닌가? – jasonbogd

+0

objective-c 메모리 관리 및 objective-c 2.0 속성을 읽어야합니다. 단순히 포인터를 nil로 설정해도 포인터가 가리키는 메모리가 해제되지 않습니다. 그러나 retain으로 특성을 지정하는 * 속성 *에 nil을 할당하면 이전에 저장된 객체는 전달 된 매개 변수에 포인터를 할당하고 retain을 호출하기 전에 릴리스 메시지를받습니다. 이 경우 매개 변수는 nil이므로 이전 객체는 release를 보내고 nil은 포인터에 할당 된 다음 retain이 nil (nil에 메시지를 보내지 않아도 아무 작업도하지 않음)에서 호출됩니다. – Jasarien

1
pointer = nil; // just clears the variable in which you store the pointer, but does not free memory. 

[pointer release]; // just frees the object (memory), but does not clear the variable used to point to it. 

self.pointer = nil; // sets the variable to nil. Also releases the object ONLY if pointer is a @property(retain) ivar. 

쉬운 방법 중 하나에 도달 할 때

의 dealloc 방법은 정상으로, 당신의 UIViewController에서이 작업을 수행하는 것입니다 호출됩니다

- (void)viewDidLoad 
{ 
    NSLog(@"MyViewController::viewDidLoad"); 
    [super viewDidLoad]; 
    // the rest of your viewDidLoad code, here. 
} 

// Etc., for the other methods of interest. 

참고 : & 릴리스를 덮어 쓰는 것으로부터 많은 정보를 수집 한 다음 디버거에서 기록하고 따라갈 수 있습니다.