Pregunta

La regla de oro de usar NSNotification parece ser

"llamar removeObserver antes de observer (o el object) se desune ".

Estoy tratando con una base de código donde no se ha seguido esta regla, pero no puedo localizar la transgresión. He buscado a través del código y me aseguré de que cada addObserver tiene una coincidencia removeObserver Pero sigo viendo informes de choque de la siguiente variedad:

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)

Mi interpretación de este informe de choque es que [UIApplication _handleApplicationSuspend:eventInfo:] está publicando una notificación para la cual un observador ha sido desasignado antes de ser eliminado.

Asumir estas interpretaciones es correcta, ¿Cómo haría para determinar qué notificación se está publicando?? E idealmente, ¿qué tipo de objeto de desunción?

¿Fue útil?

Solución

Puedes establecer un punto de ruptura simbólico en -[NSNotificationCenter postNotificationName:object:userInfo:] e imprima el tercer argumento que se le pasó (el primero es el NSNotificationCenter, el segundo, _cmd) usando el depurador po dominio.

Otros consejos

Otra forma de determinar esto es obtener el valor del parámetro de nombre (la cadena que pasó para publicar la notificación) y verificar que cualquier objeto que esté observando esa cadena/nombre se establece para eliminar la observación en algún momento del ciclo de vida de los objetos o tal como se está clasificando.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top