2013-02-19 6 views
6

Ho un @class Foo che contiene un ivar __weak id bar. Diverse azioni da metodi di classi diverse possono far sparire l'oggetto e quindi ottenere il numero bar.Desidero eseguire un'azione quando __wave ivar è niled

Voglio eseguire un'azione quando l'ivar viene automaticamente annullato da ARC.

Se possibile, vorrei evitare di trasformare bar in una proprietà o utilizzando l'osservazione valore-chiave.

È possibile? In caso contrario, KVO può essere utilizzato contro i ivar non di proprietà?

+0

La convenzione dice che dovresti nominarlo __basso errore. Sai di quale classe è questa variabile? Puoi gestirlo nel metodo dealloc. –

+0

Ramy: Sì, colpa mia, l'ho risolto nella domanda (il suo vero nome è iniziato con lettere minuscole). Per quanto riguarda 'dealloc', se possibile mi piacerebbe anche evitare di usare il metodo' dealloc' di 'bar'. Vorrei attivare questa azione all'interno di '@class Foo'. –

+0

Penso che tu voglia troppo. –

risposta

2

KVO non può essere utilizzato con successo su IVAR non di proprietà.

Non è possibile rilevare dal runtime quando ARC di Objective-C su un IVAR.

0

Suggerisco di ignorare dealloc. Se si conosce il tipo di oggetto che verrà assegnato ed è una classe personalizzata (altrimenti la sottoclasse), è possibile eseguire l'azione quando l'oggetto è deallocato, che è esattamente ciò che accade quando ARC imposta il conteggio di mantenimento su zero e imposta la variabile debole a zero.

+0

Accetterò questo a meno che non venga visualizzato un metodo senza usare KVO. Saluti! –

+1

Hmm, ho provato questo e il metodo '- (void) observValueForKeyPath: ...' non si attiva, anche se 'bar' è impostato su nil da ARC (lo sto monitorando, e posso vederlo essere impostato su zero). La documentazione sembra affermare che funziona solo per le proprietà. Sei sicuro che funzioni per Ivars? –

+1

Ok, dopo ulteriori test, '- (void) observValueForKeyPath: ...' viene attivato se imposto ivar facendo '[self setValue: object forKey: @" bar "]', ma non si attiva se imposto facendo 'bar = oggetto'. In ogni caso, non si innesca neanche quando ARC lo imposta su zero, che è quello che sto cercando. –

4

mi ha portato qui da una domanda duplicato, ecco cosa ho risposto:

Non puoi farlo con KVO, ma è ancora possibile ottenere una notifica e di emulare questo associando un oggetto con il vostro iVar utilizzando objc_setAssociatedObject(), sarà deallocato quando la variabile debole muore.

Si può costruire in cima a quello notificanti molto elaborati, utilizzando NSNotificationCenter o semplicemente personalizzati blocchi, a seconda di come pesantemente si basano su che per un caso specifico ivar o per un sacco di loro.

La cosa buona di questa soluzione è che funziona con qualsiasi __weak ivar, anche se non si controlla il tipo che ha il __weak ivar.

Problemi correlati