我看不出有什么问题。Pre-ARC,我总是制作我的 IBOutlets assign
,因为它们已经被他们的超级视图保留了。weak
正如您所指出的,如果您制作它们,则不必在 viewDidUnload 中将它们归零。
一个警告:您可以在 ARC 项目中支持 iOS 4.x,但如果这样做,您将无法使用weak
,因此您必须制作它们assign
,在这种情况下,您仍然需要 nilviewDidUnload
来避免引用一个悬空指针。这是我遇到的一个悬空指针错误的示例:
UIViewController 有一个用于邮政编码的 UITextField。它使用 CLLocationManager 对用户的位置进行反向地理编码并设置邮政编码。这是委托回调:
-(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];
}
我发现如果我在正确的时间关闭了这个视图并且没有在 self.zip 中设置 nil viewDidUnload
,委托回调可能会在 self.zip.text 上抛出一个错误的访问异常。