2010-02-24 10 views
5

Periódicamente estoy reprochando un bloqueo en una versión de depuración que se ejecuta en mi iPhone que implica un UIScrollView sin ninguno de mis códigos en el marco de la pila. Me gustaría saber si es un error en mi código o en Apple, y no puedo consultar la base de datos de errores de Apple para ver si se ha informado. La traza muestra:¿Cómo determinar si UIScrollView crash está en mi código o en Apple?

#0 0x30218060 in ___forwarding___() 
#1 0x3020eda0 in __forwarding_prep_0___() 
#2 0x309c4ce8 in -[UIScrollView(UIScrollViewInternal) _scrollViewAnimationEnded]() 
#3 0x3025af60 in -[NSObject performSelector:withObject:]() 
#4 0x3098ea94 in -[UIAnimator stopAnimation:]() 
#5 0x3098e5a8 in -[UIAnimator(Static) _advance:]() 
#6 0x3098e460 in LCDHeartbeatCallback() 
#7 0x32047fe8 in HeartbeatVBLCallback() 
#8 0x32a1c3ec in IOMobileFramebufferNotifyFunc() 
#9 0x3188a74c in IODispatchCalloutFromCFMessage() 
#10 0x3020d0b0 in __CFMachPortPerform() 
#11 0x30254a76 in CFRunLoopRunSpecific() 
#12 0x3025416a in CFRunLoopRunInMode() 
#13 0x320452a4 in GSEventRunModal() 
#14 0x308f037c in -[UIApplication _run]() 
#15 0x308eea94 in UIApplicationMain() 
#16 0x0000280c in main (argc=1, argv=0x2ffff58c) at /Users/esilver/Documents/Husband Material/main.m:14 

El problema es al parecer en UIScrollView(UIScrollViewInternal) _scrollViewAnimationEnded. BGF informa:

-[MyViewController respondsToSelector:]: message sent to deallocated instance 0x5d77ad0 

En MyViewController, tengo una llamada para desplazarse un tableView:

[self.tableView scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 

Debido a que está animado, está claro que es posible que la vista podría conseguir hecho estallar fuera del control de navegación antes del desplazamiento animación completa. Parece que UIView debería cancelar o esperar cualquier operación de desplazamiento pendiente cuando está descargando. Por lo tanto, creo que esto es un error en el código de Apple.

¿O estoy equivocado, y hay algún tipo de comprobación que mi vista debe verificar si se está desplazando antes de la descarga, o estoy malinterpretando este bloqueo por completo?

FYI, este error también solo aparece para reproducir en condiciones de poca memoria, es decir, he comenzado a recibir devoluciones de llamada de doReceiveMemoryWarning.

Gracias a todos,

Eric

Respuesta

1

Al principio, delegados deben ser de débil/asignar tipo. Pero evento en este caso hay un obstáculo sutil muy común impulsado por animaciones de desplazamiento. Si utiliza contenidos animados para compensar los cambios sus ScrollViews necesita que configure su delegado a nula en dealloc método.

De lo contrario obtendrá la siguiente

[YourViewController respondsToSelector:]: message sent to deallocated instance 

El ejemplo muy común:

1. _tableView is ivar of YourViewController 
2. _tableView.delegate = self; 
3. - (void)scrollViewDidScroll:(UIScrollView *)scrollView is implemented at YourViewController 
4. at some point you call [_tableView scrollToRowAtIndexPath:indexPath 
    atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 
    or [_tableView setContentOffset:CGPoint animated:YES] 
    and try to close YourViewController 

El _tableView es retenido por CoreAnimation, pero YourViewController se desasigna!

Cuestiones relacionadas