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 でアンロードされる方法と関係があると思います。このView Controllerは通知からそれ自体を削除していないため、このソリューションは機能しません。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 に答える