Frage

Die goldene Regel der Verwendung NSNotification scheint zu sein

"Anruf removeObserver Vor dem observer (oder der object) wird verarbeitet ".

Ich habe es mit einer Codebasis zu tun, bei der diese Regel nicht befolgt wurde, aber ich kann die Übertretung nicht finden. Ich habe den Code durchsucht und sichergestellt, dass jeder addObserver hat eine Matching removeObserver Aber ich sehe immer noch Absturzberichte über die folgende Sorte:

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)

Meine Interpretation dieses Absturzberichts ist das [UIApplication _handleApplicationSuspend:eventInfo:] veröffentlicht eine Benachrichtigung, für die ein Beobachter vor dem Entfernen behandelt wurde.

Angenommen, diese Interpretationen ist korrekt, Wie würde ich feststellen, welche Benachrichtigung veröffentlicht wird?? Und im Idealfall, was für deren Deallocated -Objekttyp?

War es hilfreich?

Lösung

Sie können einen symbolischen Haltepunkt festlegen -[NSNotificationCenter postNotificationName:object:userInfo:] und drucken Sie das dritte Argument, das an ihn weitergegeben wurde (das erste ist das NSNotificationCenter, der Zweite, _cmd) Mit dem Debugger po Befehl.

Andere Tipps

Eine andere Möglichkeit, dies zu bestimmen, besteht darin, den Parameterwert des Namens zu erhalten (die Zeichenfolge, die Sie zur Veröffentlichung der Benachrichtigung übergeben haben) und zu überprüfen, ob jedes Objekt, das beobachtet, dass String/Name so eingestellt ist, dass die Beobachtung irgendwann im Lebenszyklus des Objekts oder wie sie beobachtet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top