// Release any retained subviews of the main view. // e.g. self.myOutlet = nil;
这适用于哪些子视图?
>我在viewDidLoad中初始化的那些? (我会说是的)
>我在initWithNibName中初始化的那些? (我会说不)
>引用笔尖中的对象的IBOutlets?
如果我像这样使用视图控制器:
MyViewController *controller = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; [self.navigationController pushViewController:controller animated:YES]; [controller release];
在这种情况下,我认为持有对subview的引用的实例变量是否在viewDidUnload或dealloc中释放并不重要,因为一旦视图控制器从堆栈中弹出就会调用dealloc,所以我不如Apple所说的那样做并在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];
如果我在viewDidUnload中发布IBOutlet,会在MyViewController中发生什么?我可以指望在下一个viewDidLoad上有一个新的引用吗?
换句话说:viewDidUnload之后视图本身会发生什么?如果再次按下控制器,是否从Nib释放并重新加载?或者视图是否留在内存中?如果是这样,在viewDidLoad之前是否重新设置了出口?
如果视图保留在内存中并且在viewDidLoad之前重新设置了出口,或者每次按下控制器时重新加载出口,我认为在viewDidUnload中释放出口是正确的(即使在第一种情况下无关紧要) .但除此之外(特别是如果视图保留在内存中并且未重置插件),在viewDidUnload中释放子视图对于我提供的用例是错误的,我是否正确?
解决方法
When a low-memory warning occurs,the
UIViewController
class purges its views if it knows it can reload or recreate them again later. If this happens,it also calls theviewDidUnload
method to give your code a chance to relinquish ownership of any objects that are associated with your view hierarchy,including objects loaded with the nib file,objects created in yourviewDidLoad
method,and objects created lazily at runtime and added to the view hierarchy. Typically,if your view controller contains outlets (properties or raw variables that contain theIBOutlet
keyword),you should use theviewDidUnload
method to relinquish ownership of those outlets or any other view-related data that you no longer need.
因此,您不仅可以在viewDidUnload中释放您的插座,这是首选和推荐的方式.
是的,当调用viewDidLoad时,您可以指望您的出口指向有效对象.再次从UIViewController文档中,在viewDidLoad上:
This method is called after the view controller has loaded its associated views into memory.