10

使用の黄金律NSNotification

「 (または)の割り当てが解除removeObserverされる前に呼び出します」。observerobject

このルールが守られていないコードベースを扱っていますが、違反を見つけることができません。コードを検索して、すべてaddObserverが一致していることを確認しましremoveObserverたが、次の種類のクラッシュレポートがまだ表示されています。

OS Version:      iPhone OS 5.0.1 (9A405)
Report Version:  104

Exception Type:  SIGSEGV
Exception Codes: SEGV_ACCERR at 0x8
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                     0x31516fbc objc_msgSend + 16
1   Foundation                          0x3195b50f __57-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke_0 + 19
2   CoreFoundation                      0x37a02577 ___CFXNotificationPost_block_invoke_0 + 71
3   CoreFoundation                      0x3798e0cf _CFXNotificationPost + 1407
4   Foundation                          0x318cf3fb -[NSNotificationCenter postNotificationName:object:userInfo:] + 67
5   UIKit                               0x34e5ee25 -[UIApplication _handleApplicationSuspend:eventInfo:] + 697
6   UIKit                               0x34deed17 -[UIApplication handleEvent:withNewEvent:] + 2031
7   UIKit                               0x34dee3bf -[UIApplication sendEvent:] + 55
8   UIKit                               0x34dedd2d _UIApplicationHandleEvent + 5809
9   GraphicsServices                    0x3750bdf3 PurpleEventCallback + 883
10  CoreFoundation                      0x37a0a553 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 39
11  CoreFoundation                      0x37a0a4f5 __CFRunLoopDoSource1 + 141
12  CoreFoundation                      0x37a09343 __CFRunLoopRun + 1371
13  CoreFoundation                      0x3798c4dd CFRunLoopRunSpecific + 301
14  CoreFoundation                      0x3798c3a5 CFRunLoopRunInMode + 105
15  GraphicsServices                    0x3750afcd GSEventRunModal + 157
16  UIKit                               0x34e1c743 UIApplicationMain + 1091
17  App                                 0x00002d2f main (main.m:14)

このクラッシュレポートの私の解釈は[UIApplication _handleApplicationSuspend:eventInfo:]、オブザーバーが削除される前に割り当てが解除された通知を投稿することです。

この解釈が正しいと仮定すると、どの通知が投稿されているかをどのように判断すればよいでしょうか。そして理想的には、割り当て解除されたオブジェクトタイプは何ですか?

4

2 に答える 2

6

にシンボリックブレークポイントを設定し、デバッガコマンドを使用し-[NSNotificationCenter postNotificationName:object:userInfo:]て、渡された3番目の引数(最初の引数は、、2番目の引数NSNotificationCenter)を出力できます。_cmdpo

于 2012-02-19T11:58:11.637 に答える
0

これを判別する別の方法は、nameパラメーター値(通知を投稿するために渡した文字列)を取得し、その文字列/名前を監視しているオブジェクトが、オブジェクトのライフサイクルのいずれかまたは割り当て解除中に監視を削除するように設定されていることを確認することです。

于 2013-03-26T19:39:30.540 に答える