【发布时间】:2011-01-22 03:19:05
【问题描述】:
我一直假设在释放控制器时总是调用viewDidUnload。这是一个正确的假设吗?
我刚刚探索了一些奇怪的东西,并在我的控制器的viewDidUnload 中设置了一个断点,它是dealloc。似乎调用了dealloc,但从未调用过viewDidUnload 方法。我什至在我的dealloc 中添加了一个self.view = nil,但它似乎仍然没有调用它。
这是否意味着我在viewDidUnload 方法中释放的保留视图对象也需要在我的dealloc 方法中释放以确保它们真的消失?
我知道 StackOverflow 上还有很多其他关于 viewDidUnload 的问题,但没有一个专门针对这两种方法之间发布声明重复的问题。
在 3.1.2 SDK 的新项目中更具体的示例:
@implementation TestViewController
@synthesize label;
- (IBAction)push {
TestViewController *controller = [[[TestViewController alloc] initWithNibName:@"TestViewController" bundle:nil] autorelease];
[self.navigationController pushViewController:controller animated:YES];
}
- (void)viewDidUnload {
self.label = nil;
NSLog(@"viewDidUnload was called");
}
- (void)dealloc {
[super dealloc];
NSLog(@"label retain count: %i", [label retainCount]);
}
@end
我的应用程序委托创建了一个简单的导航控制器,其中一个作为它的根控制器。当我点击链接到push的按钮3次,然后点击返回按钮3次时,会生成以下输出。
ViewDidUnloadTest[2887:207] label retain count: 2
ViewDidUnloadTest[2887:207] label retain count: 2
ViewDidUnloadTest[2887:207] label retain count: 2
这比我认为的要高 2 倍。由视图保留一次,由控制器保留一次。但在dealloc 之后,我预计视图会消失并释放我的标签,控制器会调用viewDidUnload 并释放它。虽然此时可能有一个autorelease 在里面抛出计数。
但至少很明显 viewDidUnload 根本没有被调用,这与这里的答案相反:Are viewDidUnload and dealloc always called when tearing down a UIViewController?
也许我应该在控制器上的所有 dealloc 方法中简单地调用 [self viewDidUnload]?比可能发生的更糟糕的是,我将一个属性设置为 nil 两次,对吧?
【问题讨论】:
标签: objective-c memory-management uiviewcontroller