2011-02-10 7 views
12

Sono bloccato con un problema molto strano. Spero che molti di voi possano fornirmi suggerimenti per risolvere questo problema. La mia applicazione si interrompe abbastanza spesso, ma non sono in grado di ottenere lo scenario esatto.Reg: livello di modifica in corso di completamento ....... [Frame CALayer]: messaggio inviato all'istanza deallocato 0xe43c520

In Log ottengo seguente

2011-02-10 16:22:12.914 RCA-iOS[4132:8327] modifying layer that is being finalized - 0xe43c520 
2011-02-10 16:22:13.253 RCA-iOS[4132:207] modifying layer that is being finalized - 0xe43c520 
2011-02-10 16:22:13.270 RCA-iOS[4132:207] modifying layer that is being finalized - 0xe43c520 
2011-02-10 16:22:13.270 RCA-iOS[4132:207] modifying layer that is being finalized - 0xe43c520 
2011-02-10 16:22:13.272 RCA-iOS[4132:207] *** -[CALayer frame]: message sent to deallocated instance 0xe43c520 

seguente è il mio Analisi dello stack. Si interrompe nella filettatura principale

#0 0x01978057 in ___forwarding___ 
#1 0x01a07b42 in __forwarding_prep_1___ 
#2 0x003c196a in -[UIView(Geometry) frame] 
#3 0x003f5ff4 in -[UINavigationBar _getTitleViewFrame:leftViewFrame:rightViewFrame:forViews:forItemAtIndex:] 
#4 0x003e5cab in -[UINavigationBar _getTitleViewFrame:leftViewFrame:rightViewFrame:forViews:] 
#5 0x003f0c06 in __-[UINavigationBar layoutSubviews]_block_invoke_1 
#6 0x003bdb5c in +[UIView(Animation) _performWithoutAnimation:] 
#7 0x003f76bb in -[UINavigationBar layoutSubviews] 
#8 0x00f59451 in -[CALayer layoutSublayers] 
#9 0x00f5917c in CALayerLayoutIfNeeded 
#10 0x00f5237c in CA::Context::commit_transaction 
#11 0x00f520d0 in CA::Transaction::commit 
#12 0x00f827d5 in CA::Transaction::observer_callback 
#13 0x019e7fbb in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ 
#14 0x0197d0e7 in __CFRunLoopDoObservers 
#15 0x01945bd7 in __CFRunLoopRun 
#16 0x01945240 in CFRunLoopRunSpecific 
#17 0x01945161 in CFRunLoopRunInMode 
#18 0x02129268 in GSEventRunModal 
#19 0x0212932d in GSEventRun 
#20 0x0039e42e in UIApplicationMain 
#21 0x00001fd0 in main at main.m:14 

E di seguito è l'uscita dello strumento per oggetto NSZombie. Ciò indica UIKit

# Category Event Type RefCt Timestamp Address Size Responsible Library Responsible Caller 
0 CALayer Malloc 1 25304068864 0x10837840 48 UIKit -[UIView _createLayerWithFrame:] 
1 CALayer Zombie -1 99780847872 0x10837840 0 UIKit -[UIView(Geometry) frame] 

Nulla indica il codice. Qualcuno ha affrontato questo tipo di problema? Se si, per favore fatemelo sapere dopo
1) Quando viene visualizzato il problema di "Modifica del livello in fase di completamento"?
2) È dovuto al livello di UIView? Ad esempio (view.layer.cornerRadius)?
3) Stack Trace punta a UINAvigationBar, c'è un modo per sovrascrivere i metodi e provare qualche cosa?

Qualsiasi aiuto è apprezzato. Grazie

risposta

40

L'errore "modifying layer that is being finalized" si verifica quando si tenta di modificare le proprietà di un CALayer quando è in fase di deallocazione. L'ho visto accadere quando ho accidentalmente utilizzato un accessorio per cancellare una proprietà su un CALayer mentre all'interno del metodo -dealloc di quel livello.

Questo può accadere anche all'interno del metodo -dealloc di un UIView se viene aggiornato qualcosa relativo alla visualizzazione (toccando quindi il CALayer sottostante).

Nel tuo caso, sembra che stai sovraccaricando un UIView da qualche parte, a causa del messaggio di zombi. Lo "modifying layer that is being finalized" è solo un effetto collaterale, perché a un certo punto si aggiornerebbe l'UIView mentre è stato deallocato prima di quello che dovrebbe.

Attivare i punti di interruzione, assicurarsi di aver impostato un punto di interruzione sulle eccezioni lanciate ed eseguire l'applicazione all'interno del debugger. Dovrebbe fermarsi sulla linea in cui un messaggio viene inviato a una UIView in versione non aggiornata, che dovrebbe dirvi quale vista è al centro di questa. Quindi puoi tornare indietro per trovare a che punto stai mandando troppi messaggi di rilascio (o avere autoreleasing senza conservare se ne hai bisogno al di fuori dell'ambito attuale).

Poiché si dispone già di prove che puntano a UINavigationBar, controllarlo e le sue viste associate per assicurarsi di mantenerlo correttamente.

+0

Grazie Brad per la risposta. Sto ottenendo questo problema in un momento casuale come una volta ogni 30 ore. Ancora non sono in grado di risolverlo poiché è diventato molto difficile riprodurre lo scenario del bug per me. Il threading può essere un problema, dal momento che sto usando molti thread asincroni nell'applicazione? – D25

+0

@MegaMind - Sì, il threading potrebbe essere un'ottima fonte di problemi come questo. Assicurati di non aggiornare gli elementi dell'interfaccia utente su alcunché tranne il thread principale, o anche di provocare azioni che potrebbero indirettamente portare a una modifica dell'interfaccia utente su un thread in background. Inoltre, sii molto attento con la gestione della memoria attraverso i thread, perché c'è la possibilità che tu stia casualmente rilasciando qualcosa nel momento sbagliato qui. –

+0

Yup era un problema di threading. – D25

0

@ MegaMind- Sono stato anche bloccato con questo problema "modifica del livello che viene finalizzato" che causa la chiusura dell'app ma sono in grado di risolvere questo problema. Penso che stai rilasciando qualsiasi oggetto che viene chiamato quando appare UIView.

0

Ho ricevuto questo errore quando ho rilasciato un oggetto a cui non era mai stata assegnata l'allocazione, in modo che potesse essere questo.

0

Per aiutare i noobs (come me) che non riescono a vedere qualcosa di sbagliato con i loro mem.mgmt,

Ho anche ricevuto questo errore perché ho erroneamente utilizzato un 'assign' su una proprietà IBOutlet che doveva avere un 'retain' su di esso. Fai attenzione quando si copia-incolla!

2

Ho ricevuto questo errore quando provavo accidentalmente a rilasciare un oggetto che non avrebbe dovuto essere rilasciato, in concomitanza con il suo utilizzo per un blocco di animazione UIView. Correzione che ha fatto sparire il problema.

0

Trovato questo errore quando ho fatto clic su un UIButton. La cosa divertente era che non c'era niente di sbagliato in UIbutton, ma in realtà in una delle sotto-visualizzazioni sotto il pulsante. Ho trovato una sottoview che ha avuto e una versione extra su di esso.

Problemi correlati