2014-12-03 17 views
6

L'ho trovato nel file di intestazione di UITableView e quasi tutte le proprietà sono in stile non arc sebbene il mio progetto stia utilizzando ARC.Perché l'attributo della proprietà delegato di UITableView è debole

@property (nonatomic, assign) id <UITableViewDataSource> dataSource; 
@property (nonatomic, assign) id <UITableViewDelegate> delegate; 

Perché Apple non utilizzare weak proprietà invece di assign, si tratta di una retrocompatibilità per i non-arc? In tal caso, perché non utilizzare __has_feature(objc_arc) per distinguere ARC e non ARC.

#if __has_feature(objc_arc) 
@property (nonatomic, weak) id <UITableViewDataSource> dataSource; 
@property (nonatomic, weak) id <UITableViewDelegate> delegate; 
#else 
@property (nonatomic, assign) id <UITableViewDataSource> dataSource; 
@property (nonatomic, assign) id <UITableViewDelegate> delegate; 
#endif 

spero delegate è debole quindi non ho bisogno di impostare il delegato a zero quando l'istanza delegato viene deallocato.

Grazie per il vostro aiuto.

Edit:

faccio notare che __has_feature(objc_arc) è sbagliato, perché posso usare ARC quando la mia destinazione di distribuzione è 4,3, ma d'altra parte non posso usare weak. Quindi la condizione dovrebbe essere se il mio obiettivo di distribuzione è uguale a 5.0 o superiore.

#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_5_0 
@property (nonatomic, weak) id <UITableViewDataSource> dataSource; 
@property (nonatomic, weak) id <UITableViewDelegate> delegate; 
#else 
@property (nonatomic, assign) id <UITableViewDataSource> dataSource; 
@property (nonatomic, assign) id <UITableViewDelegate> delegate; 
#endif 
+0

Vedere la mia spiegazione qui: http://stackoverflow.com/a/24469143/341994 Non è "retrocompatibile con non ARC"; è _ non_ ARC. – matt

+0

@matt Grazie mille. Pensi che sia meglio se Apple utilizzi '#if __IPHONE_OS_VERSION_MIN_REQUIRED> = __IPHONE_5_0' per fornire un Cocoa migliore con ARC supportato? O è molto difficile riuscirci. – KudoCC

+1

Queste parti di cacao sono vecchie. Non cambieranno presto. Precedono l'ARC di molti anni. Sono quello che sono. Vai avanti. – matt

risposta

4

Perché Apple non usa weak property invece di assegnare, è una retrocompatibilità per non-arc?

Ho fatto un po 'di research and found che, il __basso è anche il modificatore "assegna". Ma solo la differenza è nell'assegnare che l'istanza del delegato non verrà impostata come nulla quando viene deallocato. Normalmente si usa il modificatore di assegnazione per IBOutlet e delegati. Sotto ARC, questo è sostituito da __weak. Tuttavia, vi è un avvertimento. __weak richiede di distribuire l'app su un runtime che supporti zero riferimenti deboli. Ciò include,> = (iOS 5 e Lion). Snow Leopard o iOS 4 e sistemi operativi meno recenti non supportano riferimenti deboli con zero. Ciò significa ovviamente che non puoi usare __disestificatori di proprietà deboli se prevedi di implementare su sistemi operativi più datati. Quindi sì, in questo sensibile è una retrocompatibilità per non-arc.

+0

Si dice __weak è anche possibile assegnare il modificatore, ma quando si utilizza assign, dopo che l'istanza delegate è stata deallocata, il delegato non verrà impostato su zero come fa il modificatore __weak. – KudoCC

+0

Sì signore è vero. Sono aggiornati, hai seguito il link e la descrizione. Lo risolverai per il motivo. –

+0

Grazie, vedrò il collegamento più tardi :) – KudoCC

0

Si noti che quando si dispone di un delegato che è assegnare, lo rende molto importante impostare sempre quel valore delegato a zero ogni volta che l'oggetto sta per essere deallocato - così un oggetto deve essere sempre attenti a zero fuori delegato riferimenti in dealloc se non lo ha fatto altrove.

Così l'assegnazione di un delegato, qualsiasi riferimento lasciato impostato, non sarà più valida dopo che un oggetto è stato deallocato (indicando la memoria non più assegnata al tipo di oggetto previsto) e quindi causerà un arresto anomalo se si tenta di utilizzarlo. Un segno di ciò nel debugger è quando il debugger afferma che alcune variabili hanno un tipo che sembra totalmente sbagliato da ciò che la variabile è effettivamente dichiarata come.

Questa potrebbe essere la ragione “Perché non è l'attributo della proprietà delegato di UITableView debole “

Spero che questo potrebbe aiutare.

Problemi correlati