0

我已经能够在运行 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 上视图的卸载方式有关。此视图控制器不会从任何通知中删除自身,因此此解决方案不起作用。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)
4

1 回答 1

0

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

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

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

于 2013-07-20T17:31:31.480 回答