【发布时间】:2012-06-17 05:10:19
【问题描述】:
添加到视图后,我正在检查子视图的 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、toolbar调用release方法后retainCount还是1,不能变成0不归零。
4,如果调用工具栏设置为nil,retainCount将为0。这个日志没用。
我的问题是:
a) 工具栏调用 removeFromSuperView 和发布 API,结果是一样的,工具栏的 retainCount 只会变成 1。所以如果我测试代码只使用它们中的每一个,结果是一样的。那么,我可以断定用户只能调用每一个 API 就可以了吗?
b)从苹果文档中,子视图添加到自身视图中,自身视图保留了工具栏句柄,所以在dealloc方法中,如果没有调用viewDidUnload,工具栏retainCount不能减为0 . 如果内存不足,系统会减少无用视图并调用viewDidUnload方法,它会自动将工具栏retainCount减少为0。所以在dealloc方法中,我应该将工具栏设置为nil。如果我将工具栏设置为 nil,我很困惑,当调用 viewDidUnload 方法时,工具栏是否会缩小?有没有内存泄漏?
谢谢。
【问题讨论】:
-
但是对于子视图内存,当子视图释放释放时,应该只调用内存不足的viewDidUnload方法吗?
-
在仪器中测试内存泄漏。像这样检查保留计数不会告诉你任何事情。
-
你永远不应该使用
retainCount:stackoverflow.com/questions/11028512/… -
我有一些内存问题,使用 Instruments Allocations 来检查内存,内存会慢慢增加。
-
您能否提供
toolbar属性的声明?它是保留/强还是弱/分配?你在使用 ARC 吗?
标签: iphone memory-leaks release addsubview retaincount