2012-10-14 10 views
21

Come si legge here nella maggior parte dei casi uno IBOutlet dovrebbe essere debole.IBOutlet per NSTextView in un progetto ARC

Ora come potete leggere nello development library, non tutte le classi supportano riferimenti deboli. (ad esempio NSTextView). Questo significa che dovete usare assegnazione:

@property (assign) IBOutlet NSTextView *textView; 

Se si utilizza un riferimento debole si otterrà il seguente errore: "Sintesi di una proprietà debole disponibile non è consentita perché richiede la sintesi di un Ivar dell'oggetto __weak "

Cosa manca la documentazione da menzionare ora è necessario reimpostare la proprietà su nil dopo il suo utilizzo, ad es. con un metodo dealloc:

- (void)dealloc 
{ 
    self.textView = nil; 
} 

Per quanto ho capito classi contrassegnati con NS_AUTOMATED_REFCOUNT_WEAK_UNAVAILABLE non supportano i riferimenti deboli, ma qual è il motivo?

+0

Come per post collegato 'IBOutlets' dovrebbe essere ** forte ** di default! – Jay

risposta

13

Credo di aver trovato la ragione per cui alcune classi non supportano un riferimento debole:

Come si può leggere here:

Motivazione: storicamente, è stato possibile per una classe di fornire il proprio implementazione dei conteggi di riferimento sovrascrivendo ritenzione, rilascio, ecc. Tuttavia, i riferimenti deboli a un oggetto richiedono il coordinamento con l'implementazione di conteggio dei riferimenti della classe, poiché, tra le altre cose, carichi deboli e negozi devono essere atomici rispetto alla versione finale. Pertanto, le implementazioni di conteggio dei riferimenti personalizzati esistenti generalmente non supportano riferimenti deboli senza ulteriori sforzi. Questo è inevitabile senza rompere la compatibilità binaria.