【问题标题】:NSString Retain CountNSString 保留计数
【发布时间】:2015-06-16 03:41:04
【问题描述】:

下面提到的代码 sn-p 中 NSString 的保留计数是多少?

self.a = @"abcd"; // self.a is a NSString with (nonatomic, Strong) Attributes

NSLog(@"Retain Count of A == %d",(int)[self.a retainCount]);

self.b = self.a;// self.b is a NSString with (nonatomic, Strong) Attributes

NSLog(@"Retain Count of A == %d",(int)[self.a retainCount]);
NSLog(@"Retain Count of B == %d",(int)[self.b retainCount]);

[self.a release];

NSLog(@"Retain Count of A == %d",(int)[self.a retainCount]);
NSLog(@"Retain Count of B == %d",(int)[self.b retainCount]);


//Similarly whats the retain count if:
self.b = [self.a retain];

【问题讨论】:

  • 我不需要值只是想知道“保留”是如何工作的?
  • 我认为无论如何它应该是(2^(32 or 64)) - 1 aka NSUIntegerMax,因为文字是不朽的。
  • 只是想知道“保留”是如何工作的你不会通过查看retainCount得到它
  • 在分配 self.b = self.a 时 self.a 的 RC 会增加 1 吗?或者当我做 self.b = [self.a retain] 时 self.a 的 RC 会增加到 2 吗?

标签: ios retaincount


【解决方案1】:

@"abcd" 是一个字符串文字。它被存储为一个常数。如果您要记录[@"abcd" class],那么您会得到__NSCFConstantString(尽管这是一个经验观察;类名不能保证)。 retain、release 等在常量字符串上是无操作的,因为它本质上与应用程序具有相同的生命周期。实际上,正如 vikingosegundo 所说,您会得到NSUIntegerMax。

您正在使用属性,所以实际发生的情况取决于您的属性类型。

对于self.b = self.a,您的期望是:

  • getter self.a 返回[[string retain] autorelease],因此在当前自动释放池的生命周期内保留计数递增;
  • setter self.b = 保留字符串,因此在 selfs 拥有字符串的生命周期内,保留计数再次增加。

如果您在自动释放池的生命周期内检查,则增加两个增量,一个长期增量。

手动调用 retain 和 release 完全按照您的想法进行。

在 ARC 下,您无需手动调用任何这些东西,包括 retainCount,并且可以优化各种保留和释放。一个著名的例子是自动释放池中随后保留的某些东西可以从池中删除。因此,self.b = self.a 可能以保留计数仅增加 1 且字符串不在自动释放池中结束,如果优化器愿意的话。

使用手动引用计数的规则相当简单:

  • 如果您有一个拥有引用(由 new、alloc、retain 或 copy 返回的引用),则释放或自动释放该引用;
  • 如果您有一个非拥有的引用 - 即任何其他类型,尽管最常见的是来自香草吸气剂 - 然后不要释放该引用。但不一定期望它在当前自动释放池的生命周期之后仍然有效。

return [[a retain] autorelease] 模式来自self 的生命周期可能比池短的观察结果。

【讨论】:

  • 很好 1... 只是澄清.. 在 self.b = self.a 之后 a & b = 2 的 RC 对吗??那么如果我执行 [self.a release],b 的 RC 会发生什么?
  • 如果self.a 和self.b 指向同一个东西,那么(除了特殊情况)self.a 上的任何操作也会发生在self.b 上。 a 和 b 指的是同一个对象,[self.a release] 对那个对象进行操作。这就是引用计数存在的原因,因为引用本身并没有唯一地跟踪任何东西,所以它们引用的对象会跟踪对自身有多少引用仍然有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多