【问题标题】:atomic make the retainCount+1atomic 使retainCount+1
【发布时间】:2015-12-25 06:44:35
【问题描述】:

我不经常使用属性 atomic,但我发现有些奇怪。我的测试文件没有使用 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.

然后我将属性 atomic 更改为 nonatomic。执行后 1)

[testArray retainCount] = 1

执行2)后

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

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

【问题讨论】:

  • 简答:retainCount 是一个内部实现细节,不应用于任何事情。
  • 奇怪的是[testArray retainCount][self.test retainCount] 可能不同。
  • @kelin 不是;对象的绝对保留计数完全没用。区别在于编译器和/或运行时的实现细节。它可能会在优化级别、平台和/或软件版本之间发生变化。
  • @bbum,但是这 2 个变量引用了同一个对象,这就是令人惊讶的原因。
  • @bbum,现在我明白了,谢谢!这实际上是问题的答案。

标签: ios objective-c memory-management


【解决方案1】:

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

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

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

【讨论】:

  • 我不同意你的看法。虽然 MRC 已过时,但在分析期间跟踪 retainCount 以了解对象会发生什么情况很有用。
  • 正如我所说,“(你的应用程序的设计)依赖它只会让你的应用程序变得脆弱。”。我从来没有说过它不能成为一个有用的调试工具。
  • @kelin 对调试也没有用。您无法知道是否有任何保留是因为自动释放池、框架的内部实现细节、因为它被捕获在一个块中和/或因为一些并发恶作剧。
【解决方案2】:

我认为 atomic 将一个对象放入当前的 Autorelease 轮询中。在使用对象时需要使对象处于活动状态(此时对象可能会在其他线程上释放)。
尝试换行

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

使用 AutoreleasePool,并在之后检查 retainCount(然后代码退出自动释放轮询)。
我想你会得到retainCount == 1。

【讨论】:

    【解决方案3】:

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

    更多信息请参见http://www.whentouseretaincount.com

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

    【讨论】:

      猜你喜欢
      • 2018-05-19
      • 1970-01-01
      • 2012-03-05
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 2012-05-17
      相关资源
      最近更新 更多