何の問題もありません。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をnilしなかったviewDidUnload
場合、デリゲートコールバックがself.zip.textで不正アクセス例外をスローする可能性があることがわかりました。