1

私はどこかで、UIViewControllerでプログラムによって作成されたビューで、Interface Builderを使用していないことを読みましたが、使用すべきではありません-viewDidLoad-viewDidUnloadこれは正しいですか?なんで?プロパティを保持しているサブビューはどこでリリースしますか?それとも、プロパティを使用しないでください。

編集:ロブネイピアの答えについての私のコメントを読んでください。

4

2 に答える 2

0

でサブビューを作成します-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-deallocsomeSubview

于 2010-06-02T16:09:51.340 に答える
0

ここで奇妙なのは、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 は、この回避策で修正する必要はありません。

だからロブスは正しい。

于 2011-03-04T15:47:06.420 に答える