私はどこかで、UIViewControllerでプログラムによって作成されたビューで、Interface Builderを使用していないことを読みましたが、使用すべきではありません-viewDidLoad
。-viewDidUnload
これは正しいですか?なんで?プロパティを保持しているサブビューはどこでリリースしますか?それとも、プロパティを使用しないでください。
編集:ロブネイピアの答えについての私のコメントを読んでください。
私はどこかで、UIViewControllerでプログラムによって作成されたビューで、Interface Builderを使用していないことを読みましたが、使用すべきではありません-viewDidLoad
。-viewDidUnload
これは正しいですか?なんで?プロパティを保持しているサブビューはどこでリリースしますか?それとも、プロパティを使用しないでください。
編集:ロブネイピアの答えについての私のコメントを読んでください。
でサブビューを作成します-viewDidLoad
。それらにivarが必要な場合は、それらの値のみを割り当てます。ビューをサブビューとしてメインビューに追加することにより、参照が保持されます。
次に、ビューがアンロードされたら、ビューが削除されて解放されてからオブジェクトが解放されているため、ivarをnilに設定する必要があります。
だからあなたのヘッダーで
@interface MyViewController : UIViewController {
IBOutlet UIView *someSubview; // assigned
}
@property (nonatomic, assign) IBOutlet UIView someSubview;
@end
そしてあなたの実装では
@implementation MyViewController
//... some important stuff
- (void)viewDidLoad;
{
[super viewDidLoad];
someSubview = [[UIView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:someSubview]; // retains someSubview
[someSubview release]; // we don't hold it
}
- (void)viewDidUnload;
{
[super viewDidUnload];
someSubview = nil; // set the pointer to nil because someSubview has been released
}
//... more important stuff
@end
someSubview
でリリースすることもできませんが、(私が正しく覚えていれば)以前に呼び出されていないため、 AND-viewDidLoad
でリリースする必要があります。ただし、保持しない場合は必要ありません。-viewDidUnload
-dealloc
-viewDidUnload
-dealloc
someSubview
ここで奇妙なのは、NIB ファイルからロードされていない UIViewController は、次のような loadView メソッドの基本実装を提供しない限り、ビューのアンロードについて通知されない (そのため、その viewDidUnload メソッドは呼び出されない) ことです。
- (void)loadView {
self.view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds] autorelease];
[self.view setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
}
- (void)viewDidLoad {
[super viewDidLoad];
// create views...
}
- (void)viewDidUnload {
// destroy views...
[super viewDidUnload];
}
これは、ベース UIViewController でのみ発生します。たとえば、UITableViewController は、この回避策で修正する必要はありません。
だからロブスは正しい。