3

NavigationController로 쌓아 놓은 UIViewController 집합이 있습니다. 이 더미의 마지막 요소에 도달하면 popToRootViewController를 수행합니다. 이 더미를 다시 만들려고하면 네비게이션 컨트롤러 더미에있는 이전 객체 중 하나에 대한 memoryWarning 및 viewDidUnload가 시스템에서 호출됩니다. 나는 이것이 ok인지, 메모리 경고를 발생 시키거나 viewDidUnload를 호출 할 때 제어 할 수 없다는 것을 안다. 문제는 어떤 이유로 그것이 'self'가 이미 할당되지 않았기 때문에 (NSZombie) 내 속성을 nil로 설정하고 메모리를 해제 할 수 없다는 것입니다. 내가하면 할당 취소 된 인스턴스로 메시지를 보냅니다.iOS 4.2 OS가 좀비 (할당되지 않은 클래스)의 viewDidUnload를 호출 중입니다.

두 가지 :

(A) 나는 그래서 더 '메모리 친화적'일 수있다 뿌리 나타 날 때있는 navigationController에서 모든 서브 뷰를 해제 강제 할 수있는 방법이 있습니까?

(b) 할당되지 않은 클래스의 viewDidUnload를 호출하는 이유는 무엇입니까?

#0 0x33a69910 in ___forwarding___() 
#1 0x33a69860 in __forwarding_prep_0___() 
#2 0x0000e4a2 in -[MyViewController viewDidUnload] at /Users/Fernando/src/Classes/MyViewController.m:866 
#3 0x32105484 in -[UIViewController unloadViewForced:]() 
#4 0x321053d0 in -[UIViewController unloadViewIfReloadable]() 
#5 0x3219ede4 in -[UIViewController purgeMemoryForReason:]() 
#6 0x3219ee04 in -[UIViewController didReceiveMemoryWarning]() 
#7 0x0000e426 in -[MyViewController didReceiveMemoryWarning]() 
#8 0x3219ee1a in -[UIViewController _didReceiveMemoryWarning:]() 
#9 0x3362d622 in _nsnote_callback() 
#10 0x33a47122 in __CFXNotificationPost_old() 
#11 0x33a46dc2 in _CFXNotificationPostNotification() 
#12 0x3361cd22 in -[NSNotificationCenter postNotificationName:object:userInfo:]() 
#13 0x33626240 in -[NSNotificationCenter postNotificationName:object:]() 
#14 0x32167da8 in -[UIApplication _performMemoryWarning]() 
#15 0x321689ca in -[UIApplication _receivedMemoryNotification]() 
#16 0x32165776 in _memoryStatusChanged() 
#17 0x33a770cc in __CFNotificationCenterDarwinCallBack() 
#18 0x33a5dbe6 in __CFMachPortPerform() 
#19 0x33a556fe in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__() 
#20 0x33a556c2 in __CFRunLoopDoSource1() 
#21 0x33a47f7c in __CFRunLoopRun() 
#22 0x33a47c86 in CFRunLoopRunSpecific() 
#23 0x33a47b8e in CFRunLoopRunInMode() 
#24 0x33b0e4aa in GSEventRunModal() 
#25 0x33b0e556 in GSEventRun() 
#26 0x32099328 in -[UIApplication _run]() 
#27 0x32096e92 in UIApplicationMain() 
#28 0x00002c72 in main at /Users/Fernando/src/main.m:13 

가 어떤 도움/제안 정말 감사 :

는 여기에 내가 얻을 스택 추적입니다!

감사합니다,

페르난도

답변

2

(A) 나는 그래서 더 '메모리 친화적 수 있습니다 루트에 나타 날 때 이 있는 navigationController에서 모든 서브 뷰를 해제 강제 할 방법이 있나요 '?

popToRootViewController의 반환 값을 잡고 공개 할 수 있습니까?

(b)는 왜 할당되지 않은 클래스의 viewDidUnload을 부를 것이다?

가능한 경우 확실하게 코드를 공유 할 수 있습니까?

+0

빠른 응답을 보내 주셔서 감사합니다. popToRootViewController의 결과로 더 많은 메모리 친숙하고 작동한다면 코드를 공유하려고 노력할 것입니다. 항목 b에 관해서, 나는 그 이유를 발견했다. 나는 viewDidUnload()에서 델리게이트 목록으로부터 탈퇴하고 있는데, 이것은 dealloc을 호출하고 좀비로 클래스와 함께 viewdidunload로 되돌아왔다. viewdidunload가 델리게이트 목록에서 탈퇴하기 가장 좋은 곳이 아닌 것 같아요 ... 다시 한번 감사드립니다! – cusquinho

+0

아이템 b 결과를 게시 해 주셔서 감사합니다! 나는 똑같은 문제에 대해 감히 받아들이는 것보다 더 많은 시간을 보냈다. viewDidUnload 메서드에서 콜백을 제거하고 dealloc을 호출하고 viewDidUnload로 돌아 왔을 때 좀비였습니다. 해결 방법은 콜백 제거를 viewWillDisappear 메서드로 옮기는 것입니다. – sradforth