2011-02-28 2 views
0

메신저 사용자 정의 UIViewController (MyVC)의 dealloc 메서드가 팝업 될 때 호출되지 않는 문제가 있습니다. SO에 대한 몇 가지 다른 답변을 읽고 그것은 내가 왜 dealloc 호출되지 않는 이유입니다 어딘가에 MyVC에 대한 참조를 잡고있는 하나의 범인 것 같습니다.UIViewController에서 dealloc 메서드가 호출되지 않는 문제

Obj *objA = [[Obj alloc] initWithValue:value]; 

MyVC *newVC = [[MyVC alloc] init]; 
newVC.somIvar = objA; 

[self.navigationController pushViewController:newVC animated:YES]; 

[newVC release]; 
[objA release]; 

난 여전히 관한 혼동이 여전히 MyVC을 밀어 루트 뷰 컨트롤러 (RootVC가)에 대한 참조 또는 할당 해제와 같은 이상한 것 자체가 해제되지 않는 MyVC 내부에 뭔가를 가지고 있음을 의미합니까하고 무엇 메서드가 호출되지 않습니다 그래서 obv는 여전히 모든 객체에 대한 참조를 가지고 있습니까?

는 지금까지 내가 그것을 MyVC 터지는에 밀어에서 이벤트의 순서를 이해 있습니다 :

  1. 만들고 뒤로 버튼은 메뉴 바, popViewControllerAnimated에 눌렀을 때
  2. 상기 한 바와 같이 RootVC에서 MyVC를 밀어 : navigationController에서 호출되고 MyVC가 팝됩니다.
  3. MyVC에 대한 추가 참조가 없으면 navigationController가 dealloc 메서드를 호출합니까?

3 번이 확실하지 않습니까? 나는 장비를 사용하여 누출을 발견하지 못했고, dealloc 메소드가 호출되지 않았기 때문에 MyVC 내부의 무언가가 될 수없는 것처럼 보입니다. 어쨌든 어떻게 정리합니까?

답변

0

vC를 다른 객체의 iVar에 할당하기 위해 점 표기법을 사용하고 있으므로 해당 객체에 의해 vC가 유지됩니다 (속성 선언에 retain을 선언했다고 가정).

개체 '클래스'dealloc 메서드에서 iVar (따라서 vC)를 해제하지 않으면 개체가 튀어 나오더라도 해제되지 않습니다. 그러므로 [somIvar release]을 객체 dealloc 메소드에 추가하면 모두 잘됩니다 ...

Btw, iVar에 할당 한 직후 vC를 해제하는 것은 객체가 자체 해제 될 때까지 객체에 유지되므로 취소해야합니다.

+0

"나는 다른 객체의 iVar에 vC를 할당하기 위해 점 표기법을 사용하고 있으므로", im은 혼란 스럽긴하지만 응답은 Thx입니다. 나는 내 newVC에서 ivar에 ojbA를 할당하고 있다고 생각했다. 또한 newVC의 dealloc 메소드 내에 [someIvar release]가 있습니다. 그러나 언급했듯이 dealloc 메소드는 newVC에 대해 호출되지 않으므로 자연스럽게 [someIvar release]도 호출되지 않습니다. – James

+0

@James : 네 말이 맞아, 토스터가 혼란스러워하는 것 같아. 거기에 유지되는 objA입니다 (적어도 속성이 할당 또는 복사하는 대신 보유 선언 된 경우). 내가 게시 한 코드에는 newVC가 추가로 보유 할 수있는 내용이 없습니다. – Anomie

+0

네 말이 맞아. 나는 물건을 섞었다, 미안하다! !! 그렇다면 일들이 분명하지 않습니다. 두려워요. 나는 다시 생각할 것이고, 다른 아이디어를 생각해 내지 않으면 내 대답을 삭제할 것입니다. 다시, 미안 해요! – Toastor

관련 문제