Je ne vois pas de problème à cela. Avant l'ARC, j'ai toujours fait en sorte que mes IBOutlets assign
car ils sont déjà retenus par leurs supervisions. Si vous les faites weak
vous ne devriez pas avoir à les réduire à néant dans viewDidUnload, comme vous le faites remarquer.
Un bémol : vous pouvez prendre en charge iOS 4.x dans un projet ARC, mais si vous le faites, vous ne pouvez pas utiliser weak
donc tu dois les faire assign
dans ce cas, vous voudrez toujours rendre nulle la référence dans viewDidUnload
pour éviter un pointeur qui pendouille. Voici un exemple d'un bug de type "dangling pointer" que j'ai rencontré :
Un UIViewController possède un UITextField pour le code postal. Il utilise CLLocationManager pour inverser le géocodage de l'emplacement de l'utilisateur et définir le code postal. Voici le callback du délégué :
-(void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
Class geocoderClass = NSClassFromString(@"CLGeocoder");
if (geocoderClass && IsEmpty(self.zip.text)) {
id geocoder = [[geocoderClass alloc] init];
[geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) {
if (self.zip && IsEmpty(self.zip.text)) {
self.zip.text = [[placemarks objectAtIndex:0] postalCode];
}
}];
}
[self.locationManager stopUpdatingLocation];
}
J'ai découvert que si je rejetais cette vue au bon moment et que je ne mettais pas à zéro self.zip dans le fichier viewDidUnload
le callback du délégué pourrait lancer une exception de mauvais accès sur self.zip.text.
11 votes
A titre d'information,
IBOutletCollection()
ne doit pas êtreweak
sinon, il retourne commenil
.0 votes
Xcode 8.2.1 utilise des faiblesses lors de la création de IBOutlets via le constructeur d'interface. Cependant, de nombreuses réponses ici sur SO conseillent d'utiliser strong.
1 votes
@neoneye Je viens d'essayer avec xcode 8.3.2 de glisser du storyboard vers le fichier swift et il s'agit par défaut de
strong