我一直把头撞在墙上。
我有一个具有根视图控制器和两个子视图控制器的应用程序。其中一个孩子是导航控制器。另一个是带有一堆按钮的视图。当在菜单上按下按钮时,将实例化相应的视图控制器,并且导航控制器将其视图控制器设置为包含此新控制器的单个项目数组。
所有这一切都很好。问题是,如果我使用该应用程序,然后模拟内存警告它崩溃尝试向僵尸发送消息。僵尸每次都不同,但始终是视图控制器或已经解除分配的视图控制器视图的子视图。例如,如果我将导航控制器设置为A然后按B,则弹出B我可以在B' s dealloc中断并看到它被删除。然后,如果我模拟警告,我会发生崩溃,因为有些东西试图向B发送消息。
以下是示例跟踪:
0 CoreFoundation ___forwarding___
1 CoreFoundation _CF_forwarding_prep_0
2 UIKit +[UIViewController _traverseViewControllerHierarchyWithDelayedReleaseArray:block:]
3 UIKit +[UIViewController _traverseViewControllerHierarchyWithDelayedRelease:]
4 UIKit -[UIApplication _performMemoryWarning]
5 UIKit -[UIApplication _receivedMemoryNotification]
6 UIKit __43-[UIApplication setReceivesMemoryWarnings:]_block_invoke_2
7 libdispatch.dylib _dispatch_client_callout
8 libdispatch.dylib _dispatch_source_latch_and_call
9 libdispatch.dylib _dispatch_source_invoke
10 libdispatch.dylib _dispatch_main_queue_callback_4CF
11 CoreFoundation __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__
12 CoreFoundation __CFRunLoopRun
13 CoreFoundation CFRunLoopRunSpecific
14 CoreFoundation CFRunLoopRunInMode
15 GraphicsServices GSEventRunModal
16 GraphicsServices GSEventRun
17 UIKit UIApplicationMain
18 myapp main /Users/blahblahblah/main.m:18
19 libdyld.dylib start
调用应用程序代理applicationDidReceiveMemoryWarning
,但在崩溃之前未在我的任何视图控制器上调用didReceiveMemoryWarning
。
分析没有泄漏也没有警告,我遵守了包容视图控制器的规则。