添加到视图后,我正在检查子视图的retainCount。代码是:
- (void) loadView{
//...
toolbar = [[UIToolbar alloc] initWithFrame:nil];
[[self view] addSubView:toolbar];
}
- (void) dealloc{
NSLog(@"count=%d", [toolbar retainCount]); // count=2
[toolbar removeFromSuperView];
NSLog(@"count=%d", [toolbar retainCount]); // count=1
[toolbar release]
NSLog(@"count=%d", [toolbar retainCount]); // count=1
toolbar = nil;
NSLog(@"count=%d", [toolbar retainCount]); // count=0
}
从 dealloc{} 中的这段代码来看,我有一些问题:
1、toolbar的第一个日志retainCount是2,因为toolbar在init之后添加到self view,retaincount会变成2。
2、工具栏removeFromSuperView后retainCount会变为1。
3、工具栏调用释放方法后,retainCount还是1,不能变成0。在我的选项中,因为超级视图是保留工具栏(自身视图不释放),所以工具栏不能重用0。
4,如果调用工具栏设置为nil,retainCount将为0。这个日志是没用的。
我的问题是:
a)工具栏调用removeFromSuperView和release API,结果是一样的,工具栏retainCount只会变成1。所以如果我测试代码只使用它们中的每一个,结果是一样的。那么,我可以断定用户只能调用每个 API 就可以了吗?
b)从苹果文档中,子视图被添加到自身视图中,自身视图已经保留了工具栏句柄,所以在dealloc方法中,如果没有调用viewDidUnload,工具栏retainCount不能减少到0。如果内存不足,系统会减少无用视图并调用viewDidUnload方法,它会自动将工具栏retainCount减少为0。所以在dealloc方法中,我应该将工具栏设置为nil。如果我将工具栏设置为 nil,我很困惑,当调用 viewDidUnload 方法时,工具栏是否会缩小?有没有内存泄漏?
谢谢。