Crash in actionForLayer: forKey:

Tengo un críptico EXC_BAD_ACCESS cuando cambio el marco de UILabel. El crash es aleatorio, por lo general tengo que repetir las condiciones durante varios minutos.

Habilitar NSZombies, así como otros indicadores de debugging de memory (NSDebugEnabled, MallocStackLogging), no ayuda, las imágenes fijas de locking siguen siendo opacas: solo un BAD_ACCESS sin post en la console. El objective parece correcto y vivo, por lo que no parece un problema de memory desasignado.

Para get más información, subclasé UILabel y reescribí la function de locking:

@implementation TestUILabel - (id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event { return [super actionForLayer:layer forKey:event]; } @end 

Se cuelga en el método del súper, pero en la inspección todo parece correcto (la printing retainCount para 'self' y 'layer' da respectivamente 3 y 2):

(gdb) po self

<TestUILabel: 0x6ac2800; baseClass = UILabel; frame = (173 174; 0 0); text = '54 m² '; opaco = NO; autoresize = LM + TM; autoresizesSubviews = NO; userInteractionEnabled = NO; animaciones = {position = <CABasicAnimation: 0xe07ba60>; }; capa = <CALayer: 0xbf1b950 >>

(gdb) po evento

límites

(gdb) capa de po

<CALayer: 0xbf1b950; position = CGPoint (173 174); bounds = CGRect (0 0; 0 0); delegate = <TestUILabel: 0x6ac2800; baseClass = UILabel; frame = (173 174; 0 0); text = '54 m² '; opaco = NO; autoresize = LM + TM; autoresizesSubviews = NO; userInteractionEnabled = NO; animaciones = {position = <CABasicAnimation: 0xe07ba60>; }; capa = <CALayer: 0xbf1b950 >>; contenidos = <CGImage 0xe04ed60>; opacidad = 1; animations = [position = <CABasicAnimation: 0xe07ba60>]>

¿Alguien tuvo un problema similar? ¿O tienes alguna idea de dónde podría venir?

Gracias por adelantado !

Edit: aquí está el backtrace completo de locking:

Tema 1, Cola:
com.apple.main-thread
# 0 0x00459b2c in – [UIView (CALayerDelegate) actionForLayer: forKey:] ()
# 1 0x00eaaac7 en – [CALayer actionForKey:] ()
# 2 0x00ea80fe en actionForKey (CALayer *, CA :: Transaction *, NSString *) ()
# 3 0x00ea8066 en beginChange (CALayer *, CA :: Transaction *, unsigned int, objc_object * &) ()
# 4 0x00eaba3a en CALayerSetPosition (CALayer *, CA :: Vec2 const &, bool) ()
# 5 0x00eab8b5 in – [CALayer setPosition:] ()
# 6 0x00eab7cc in – [CALayer setFrame:] ()
# 7 0x0045739d en – [UIView (Geometry) setFrame:] ()
# 8 0x00542a68 en – [UILabel setFrame:] ()
# 9 0x0000a97f in – [MosaicElementView setupWithAdvert:] en /Users/eino/Prog/AJ/Classes/Search/SubViews/MosaicElementView.m:30
# 10 0x00079cb9 in – [SearchResultsViewController setupElement: withCell: indexPath: actualIndex:] ()
# 11 0x000797a2 en – [SearchResultsViewController tableView: cellForRowAtIndexPath:] ()
# 12 0x004957fa in – [UITableView (UITableViewInternal) _createPrepanetworkingCellForGlobalRow: withIndexPath:] ()
# 13 0x0048b77f in – [UITableView (UITableViewInternal) _createPrepanetworkingCellForGlobalRow:] ()
# 14 0x004a0450 en – [UITableView (_UITableViewPrivate) _updateVisibleCellsNow:] ()
# 15 0x00498538 in – [UITableViewSubview layout] ()
# 16 0x00eb0451 in – [CALayer layoutSublayers] ()
# 17 0x00eb017c en CALayerLayoutIfNeeded ()
# 18 0x00ea937c en CA :: Context :: commit_transaction (CA :: Transacción *) ()
# 19 0x00ea90d0 en CA :: Transacción :: commit () ()
# 20 0x00ed97d5 en CA :: Transaction :: observer_callback (__ CFRunLoopObserver *, unsigned long, void *) ()
# 21 0x017e9fbb en __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ ()
# 22 0x0177f0e7 en __CFRunLoopDoObservers ()
# 23 0x01747bd7 en __CFRunLoopRun ()
# 24 0x01747240 en CFRunLoopRunSpecific ()
# 25 0x01747161 en CFRunLoopRunInMode ()
# 26 0x01e7d268 en GSEventRunModal ()
# 27 0x01e7d32d en GSEventRun ()
# 28 0x0043042e en UIApplicationMain ()
# 29 0x000021fe en principal en /Users/eino/Prog/AJ/main.m:11

La línea de degradado del marco 9 es básicamente el cambio de marco:

 labelPrice.frame = rect; 

con rect siendo un CGRect correcto (106, 143, 86, 22).

Probablemente ya hayas comprobado esto, pero vale la pena disparar …

¿Estás seguro de que no estás haciendo nada que afecte a los elementos de la IU en un hilo de background? Tal vez esté haciendo algún cálculo relacionado con esta búsqueda y cambia una propiedad de alguna vista.

He visto su tipo de cosas en los casos en que olvidé un performSelectorOnMainThread: withObject: waitUntilDone: llama y luego modifica la interfaz de usuario en segundo plano.