atomic使retainCount + 1

时间:2015-12-25 06:44:36

标签: ios objective-c memory-management

我不经常使用属性原子,但我发现有些奇怪的东西。我的测试文件不使用ARC 我使用了一个属性@property(atomic,retain) NSArray* test; 然后我只是在init方法中对事物进行测试。 像这样

1) NSArray* testArray = [NSArray arrayWithObject:@"1"];
2) self.test = testArray;

执行1)后

[testArray retainCount] = 1

执行2)后

[testArray retianCount] = 2
[self.test retainCount] = 3 
[_test retainCount] = 3.

然后我将属性原子更改为非原子。执行1)后

[testArray retainCount] = 1

执行2)后

[testArray retianCount] = 2
[self.test retainCount] = 2
[_test retainCount] = 2.

所以我不知道为什么。 atomic可以添加retainCount吗?

3 个答案:

答案 0 :(得分:0)

您不应该在这个时代进行手动参考计数。说真的,使用ARC没有任何缺点。我能想到的唯一原因是,如果您需要维护无法转换为ARC的遗留代码(由于资源分配优先级等)。

即使在MRC时代,Apple 强烈也不鼓励直接操纵retainCount属性:这只是一个实现细节,依赖它会让你的应用程序变得脆弱。

您应该围绕对象图(所有权关系)设计您的应用程序,无论是使用ARC还是MRC。

答案 1 :(得分:0)

我认为 atomic 将一个对象放到当前的Autorelease民意调查中。使用它时需要使对象处于活动状态(此时对象可能会在另一个线程上释放) 尝试换行

NSArray* testArray = [NSArray arrayWithObject:@"1"];
self.test = testArray;

使用AutoreleasePool,然后检查retainCount(然后代码从autorelease poll退出) 我想你会得到retainCount == 1.

答案 2 :(得分:0)

retainCount的绝对值完全没用。你无法从中推断出对象生命周期的含义,也不能对调试特别有用。

有关详细信息,请参阅http://www.whentouseretaincount.com

就您的具体情况而言,由于实施细节,保留计数正在改变atomic的行为。如果您在优化和非优化版本之间切换,您可能会看到不同的结果。