Sto scrivendo app iOS utilizzando ARC e targeting per iOS 5+.Impostare i delegati su zero sotto ARC?
Supponiamo di scrivere un oggetto di visualizzazione personalizzato con una proprietà delegata. Nel dichiarare la proprietà delegato, faccio un riferimento debole per evitare un ciclo trattengono, in modo che quando l'oggetto delegato effettivo (controllore) è distrutta, ritengo ordinazione inoltre essere distrutto, come segue:
@interface MyCustomView : UIView
@property (nonatomic, weak) id<MyCustomViewDelegate> delegate;
@end
Va tutto bene.
Ok, quindi sto scrivendo l'oggetto controller e ha riferimenti a due oggetti vista: la mia vista personalizzata e una vista UIKit fornita da Apple, che dichiarano entrambe le proprietà delegate e il controller è il delegato per entrambi i punti di vista. Forse è simile a questa:
@interface MyViewController : UIViewController <MyCustomViewDelegate, UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, strong) MyCustomView *customView;
@property (nonatomic, strong) UITableView *tableView;
@end
@implementation MyViewController
- (void)viewDidLoad
{
self.customView.delegate = self;
self.tableView.dataSource = self;
self.tableView.delegate = self;
}
@end
mia domanda è questa: Ho bisogno di ignorare dealloc per impostare uno o entrambi i delegati a zero?
Cioè, come risulta, la proprietà delegato della vista UIKit (in questo caso, tableView
) non è effettivamente dichiarata come riferimento debole, ma piuttosto un riferimento __unsafe_unretained
, per la compatibilità con i non-ARC versione di iOS. Quindi forse ho bisogno di scrivere
- (void)dealloc
{
_tableView.dataSource = nil;
_tableView.delegate = nil;
}
Ora, se devo ignorare dealloc, io ancora non dover impostare _customView.delegate = nil
, giusto? Perché è stato dichiarato (da me) come riferimento debole, quindi dovrebbe essere impostato su zero automaticamente alla distruzione di MyViewController
.
Ma d'altra parte, non sto prendendo di mira versioni non ARC di iOS, né ho intenzione di farlo. Quindi forse non ho bisogno di sovrascrivere dealloc?
Potrebbe non esserne a conoscenza, ma la raccomandazione corrente è che IBOutlets * contenuto in una gerarchia di viste * dovrebbe essere debole. In altre parole, se tableView è contenuto in una vista, la vista viene mantenuta dal riferimento forte e non è necessario che TableView sia. Ciò rende il tuo caso un po 'artificiale, anche se è ancora una domanda legittima per quel caso (che ha altre istanze più reali). –
@StevenFisher Grazie, Steven. Ne ero a conoscenza, ma nel mio esempio non ho dichiarato che le proprietà della vista fossero IBOutlet; forse li sto generando programmaticamente piuttosto che tramite IB. –
@StevenFisher Immagino che la cosa più curiosa sia la differenza tra le dichiarazioni di proprietà '__weak' e '__unsafe_unretained', e quale sia la mia responsabilità rispetto a quelle dichiarazioni diverse quando scelgo come target le versioni post-ARC di iOS. –