关于保留计数[关闭]

Posted

技术标签:

【中文标题】关于保留计数[关闭]【英文标题】:Regarding retain count [closed] 【发布时间】:2013-01-24 07:38:20 【问题描述】:
NSArray *arr = [[NSArray arrayWithObjects:@"ag", @"sdfg", @"dgh", nil] retain];
NSArray *newArr = [[arr mutableCopy] retain];
[arr release];
[newArr release];
newArr = [NSArray arrayWithObject:@"sdfdhs"];

每行之后会保留什么计数?请给我解释一下。谢谢你...

【问题讨论】:

看看whentouseretaincount.com 用仪器自己看看吧。 你在采访我们吗? 【参考方案1】:

保留计数几乎没有用,请参阅http://whentouseretaincounts.com 了解详细信息。

但是,我在您的代码中添加了对 retainCount 的调用并运行以下命令:

NSArray *arr = [[NSArray arrayWithObjects:@"ag", @"sdfg", @"dgh", nil] retain];
NSLog(@"%ld", [arr retainCount]);

NSArray *newArr = [[arr mutableCopy] retain];
NSLog(@"%ld", [newArr retainCount]);

[arr release];
NSLog(@"%ld", [arr retainCount]);

[newArr release];
NSLog(@"%ld", [newArr retainCount]);

newArr = [NSArray arrayWithObject:@"sdfdhs"];
NSLog(@"%ld", [newArr retainCount]);

得到以下结果:

2013-01-24 15:45:56.840 Untitled 2[96774:707] 2 
2013-01-24 15:45:56.842 Untitled 2[96774:707] 2 
2013-01-24 15:45:56.842 Untitled 2[96774:707] 1 
2013-01-24 15:45:56.843 Untitled 2[96774:707] 1 
2013-01-24 15:45:56.843 Untitled 2[96774:707] 1

第一个结果是 2 而不是 1 因为来自 arrayWithObjects 的返回值已经被自动释放但实际上还没有被释放,因为自动释放池还没有被刷新(这通常发生在事件循环中)。

第二个结果是2,因为mutableCopy返回了一个保留对象,而我们又retain了它。

第三个结果是1,因为我们释放了arr,它的保留计数为2。仍然没有刷新自动释放池。

第四个结果是1,因为我们发布了newArr,它的保留计数为2

最终结果是1,因为我们泄露了newArr 的内容,并为变量分配了一个新的自动释放数组。 1 的保留计数是尚未自动释放的计数。

但是,不应信任保留计数。了解内存管理规则(无论您是否使用 ARC)。

【讨论】:

以上是关于关于保留计数[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

JAVA 关于科学计数法的解决

关于我的 C 编程的逻辑方程 [关闭]

如何找到保留计数?

是否可以更改一个函数(如计数器)中的全局变量,然后保留该值以供另一个函数使用? [重复]

为啥在启用 ARC 的项目中不需要维护保留计数

了解分配仪器保留计数