我不经常使用属性原子,但我发现有些奇怪的东西。我的测试文件不使用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吗?
答案 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
的行为。如果您在优化和非优化版本之间切换,您可能会看到不同的结果。