Rap*_*ert 7 iphone objective-c uiviewcontroller nib ios
我对基于Nib的UIViewControllers中发生的事情感到有点困惑.生成UIViewController子类时,模板在viewDidUnload方法中包含非常具体的注释:
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
Run Code Online (Sandbox Code Playgroud)
这适用于哪些子视图?
viewDidLoad?(我会说是的)initWithNibName?(我会说不)如果我像这样使用视图控制器:
MyViewController *controller = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
[self.navigationController pushViewController:controller animated:YES];
[controller release];
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我想这没有多大关系是否持有到子视图引用实例变量被释放viewDidUnload或dealloc因为dealloc应该得到尽快视图控制器从堆栈中弹出,所以我还不如做苹果所谓的说,释放实例变量viewDidUnload而不是dealloc.
但是假设我用作MyViewController可以多次推送的实例变量:
if(self.myViewController == nil) {
self.myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
}
//Change some state which should be reflected in the view
self.myViewController.someProperty = someValue;
[self.navigationController pushViewController:self.myViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)
MyViewController如果我发布IBOutlet 会发生什么viewDidUnload?我可以指望在下一个新的参考viewDidLoad吗?
换句话说:之后视图本身会发生什么viewDidUnload?如果再次按下控制器,是否从Nib释放并重新加载?或者视图是否留在内存中?如果是这样,出口之前viewDidLoad是否重新设置?
如果视图保留在内存中并且viewDidLoad每次按下控制器之前重新设置插座或重新加载插座,我认为释放插座是正确的viewDidUnload(即使在第一种情况下无关紧要).但除此之外(特别是如果视图保留在内存中并且没有重新设置插座),发布子视图viewDidUnload对于我提供的用例是错误的,我是否正确?
从UIViewController文档,内存管理部分:
发生低内存警告时,如果
UIViewController类知道它可以重新加载或稍后再次重新创建它们,则该类会清除其视图.如果发生这种情况,它还会调用该viewDidUnload方法,让您的代码有机会放弃与视图层次结构相关联的任何对象的所有权,包括使用nib文件加载的对象,在viewDidLoad方法中创建的对象以及在运行时延迟创建的对象.添加到视图层次结构中.通常,如果视图控制器包含出口(属性或包含IBOutlet关键字的原始变量),则应使用该viewDidUnload方法放弃这些出口的所有权或您不再需要的任何其他视图相关数据.
因此,您不仅可以释放您的插座viewDidUnload,这是首选和推荐的方式.
是的,您可以指望在viewDidLoad调用时让您的出口指向有效对象.再次从UIViewController文档中,viewDidLoad:
在视图控制器将其关联的视图加载到内存后调用此方法.
| 归档时间: |
|
| 查看次数: |
2807 次 |
| 最近记录: |