我在某处看到,在UIViewController中以编程方式创建的视图中,不使用Interface Builder,不应使用-viewDidLoad
和-viewDidUnload
。这是正确的吗?为什么?我将在哪里发布我保留属性的子视图?或者我应该不为它们使用属性?
编辑:阅读我对Rob Napier的回答的评论。
答案 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修复。
所以罗布斯是对的。