内存不足警告会导致iOS5崩溃 - unloadViewForced

时间:2013-07-20 16:44:27

标签: ios ios5 memory uiviewcontroller crash

我能够在运行iOS5的iOS设备上复制低内存崩溃。每次堆栈跟踪指向同一个地方,所以我确切地知道问题所在。不幸的是我不知道如何解决它。如下所示,当CatViewController收到内存警告时发生崩溃。此时它的视图被强制卸载,然后发生崩溃:

0   libobjc.A.dylib                 0x37174f7e objc_msgSend + 22
1   UIKit                           0x317eab66 -[UIViewController unloadViewForced:] + 130
2   UIKit                           0x31932492 -[UIViewController purgeMemoryForReason:] + 58
3   MyApp                       0x001353c0 -[CatViewController didReceiveMemoryWarning] (CatViewController.m:89)
4   Foundation                      0x339e34f8 __57-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke_0 + 12
5   CoreFoundation                  0x35178540 ___CFXNotificationPost_block_invoke_0 + 64
6   CoreFoundation                  0x35104090 _CFXNotificationPost + 1400
7   Foundation                      0x339573e4 -[NSNotificationCenter postNotificationName:object:userInfo:] + 60
8   Foundation                      0x33958c14 -[NSNotificationCenter postNotificationName:object:] + 24
9   UIKit                           0x318fd26a -[UIApplication _performMemoryWarning] + 74
10  UIKit                           0x318fd364 -[UIApplication _receivedMemoryNotification] + 168
11  libdispatch.dylib               0x37ae6252 _dispatch_source_invoke + 510
12  libdispatch.dylib               0x37ae3b1e _dispatch_queue_invoke$VARIANT$up + 42
13  libdispatch.dylib               0x37ae3e64 _dispatch_main_queue_callback_4CF$VARIANT$up + 152
14  CoreFoundation                  0x3517f2a6 __CFRunLoopRun + 1262
15  CoreFoundation                  0x3510249e CFRunLoopRunSpecific + 294
16  CoreFoundation                  0x35102366 CFRunLoopRunInMode + 98
17  GraphicsServices                0x3476d432 GSEventRunModal + 130
18  UIKit                           0x31779e76 UIApplicationMain + 1074
19  MyApp                       0x00087142 main (main.m:16)
20  MyApp                       0x000870c8 start + 32

所以我认为这与在iOS5上卸载视图的方式有关。此视图控制器未从任何通知中删除自身,因此this solution不起作用。 CatViewController的第89行就是这样:

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning]; //this is line 89
}

viewDidUnload看起来像这样:

- (void)viewDidUnload {
    [self setBackgroundView:nil];
    [self setContentView:nil];
    [self setSomeScrollView:nil];
    [super viewDidUnload];
}

关于如何在不崩溃的情况下优雅地处理此问题的任何想法?

编辑:这是关于另一个崩溃报告的更多信息:

0   CoreFoundation                  0x351ac88f __exceptionPreprocess + 163
1   libobjc.A.dylib                 0x3717a259 objc_exception_throw + 33
2   CoreFoundation                  0x351afa9b -[NSObject doesNotRecognizeSelector:] + 175
3   CoreFoundation                  0x351ae915 ___forwarding___ + 301
4   CoreFoundation                  0x35109650 _CF_forwarding_prep_0 + 48
5   UIKit                           0x317eabdf -[UIViewController unloadViewForced:] + 251
6   UIKit                           0x31932499 -[UIViewController purgeMemoryForReason:] + 65
7   MyApp                       0x000d541b -[CatViewController didReceiveMemoryWarning] (CatViewController.m:96)

1 个答案:

答案 0 :(得分:0)

您的应用没有崩溃,因为内存不足。在崩溃报告中,您可以看到抛出的异常实际上是[NSObject doesNotRecognizeSelector:]

首先,您应该将那些设置为nil语句移至didReceiveMemoryWarning;这是首选方法,因为iOS 6中不再支持viewDidUnload。

其次,要查找崩溃,请逐步执行将属性设置为nil的语句,并确保这些语句都不会导致崩溃。请注意,如果这些变量被声明为属性,而不仅仅是实例变量,那么只有具有这些签名的方法(self set<propertyName>:])。