iPhone dev - viewDidLoad和viewDidUnload在以编程方式创建的视图中?

时间:2010-06-02 15:28:54

标签: iphone memory-management uiviewcontroller viewdidload

我在某处看到,在UIViewController中以编程方式创建的视图中,不使用Interface Builder,不应使用-viewDidLoad-viewDidUnload。这是正确的吗?为什么?我将在哪里发布我保留属性的子视图?或者我应该不为它们使用属性?

编辑:阅读我对Rob Napier的回答的评论。

2 个答案:

答案 0 :(得分:0)

-viewDidLoad中创建子视图。如果您需要ivars,那么只需分配它们的值。通过将视图作为子视图添加到主视图来保持引用。

然后,当你的视图被卸载时,你应该将你的ivars设置为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中发布-viewDidLoad,那么您必须在-viewDidUnload-dealloc中发布,因为(如果我没记错的话){在-viewDidUnload之前未调用{1}}。但如果您不保留-dealloc,则无需这样做。

答案 1 :(得分:0)

这里奇怪的是,没有从NIB文件加载的UIViewController没有被通知它的视图卸载(因此它的viewDidUnload方法没有被调用),除非你提供了loadView方法的基本实现,例如: p>

- (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不需要用这个workaroud修复。

所以罗布斯是对的。