我认为没有任何问题。在ARC之前,我一直制作IBOutlets assign
,因为它们已被其超级视图保留。如果您制作了它们weak
,就不必像您指出的那样在viewDidUnload中删除它们。
一个警告:您可以在ARC项目中支持iOS 4.x,但如果不能,则不能使用weak
,因此必须将它们制作assign
成这种情况,在这种情况下,您仍然想引用其中的内容viewDidUnload
以避免悬空的指针。这是我遇到的悬空指针错误的示例:
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保留为n viewDidUnload
,则委托回调可能会在self.zip.text上引发错误的访问异常。
IBOutletCollection()
不能为weak
,否则返回为nil
。