可能重复:
check retain count
当我正在玩retain
时,release
计数,我遇到了一种情况,我无法解释。请帮助我更好地理解它:
O
。它不包含任何变量,也不做任何事情。O
并递增,递减计数
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
o = [[O alloc]init]; // At this moment [o retainCount] is 1 as expected
....
对于每个doRetain,按预期计算增量
- (IBAction)doRetain:(id)sender {
[o retain];
NSString *result = [[NSString alloc] initWithFormat:@"%d", [o retainCount]];
[label setText: result];
[result release];
}
每当调用释放时,计数减少
- (IBAction)doRelease:(id)sender {
[o release];
NSString *result = [[NSString alloc] initWithFormat:@"%d", [o retainCount]];
[label setText: result];
[result release];
}
考虑1个保留和2个版本
请帮助我理解这种行为
答案 0 :(得分:4)
如果您的保留计数为1并且您释放,则该对象不再有效,并且releaseCount属性无意义(并且其结果是不可预测的)。
另外,我知道这是一个测试,但你用'alloc'创建你的字符串,但从不发布它们。
在处理发布和保留时,您只负责释放您自己的保留。其他对象可能会对相关对象执行保留,然后它们将释放它们。
如果使用包含单词alloc
,copy
或create
的方法获取对象,则所述对象上会隐含retain
。否则,您可以假设对象将在当前运行循环后消失,因此如果要挂起对象的副本,则需要执行保留。完成对象后,请执行发布。
答案 1 :(得分:2)
实际上,保留计数是一个可怕的误导性数据,是一个可怕的学习工具。唯一一次,如果符合以下条件,您可以指望保留计数为您期望的值:
你是NSObject的子类(或者创建你自己的根类)
不要将您的对象传递给任何系统API
不要使用autorelease
一旦违反任何规则,保留计数就会成为一个实施细节,其价值超出您的控制范围。当然,在简单的情况下,它将是相对一致的。直到它没有,然后你会使用不准确的工具基于错误的假设调试一些东西。
即。
cocoa memory management guide确切地定义了应如何管理保留和发布。
您应该将保留计数视为delta;操作将保持不变或增加或减少它。如果你增加它,你必须减少放弃所有权。绝对值不重要。
答案 2 :(得分:1)
正如在最近的另一篇文章中所提到的,你永远不应该真正使用[retainCount]函数!