【发布时间】:2018-05-19 06:13:05
【问题描述】:
当我使用 __weak 指针引用 NSObject 时,会显示意外的 retainCount。
代码如下:
id obj1 = [[NSObject alloc] init];
id __weak obj2 = obj1;
NSLog(@"obj1: %ld", CFGetRetainCount((__bridge CFTypeRef)obj1)); // line 31
NSLog(@"obj2: %ld", CFGetRetainCount((__bridge CFTypeRef)obj2)); // line 32
NSLog(@"obj1 again: %ld", CFGetRetainCount((__bridge CFTypeRef)obj1)); // line 33
所以~我的疑惑是,obj2的retainCount应该是1,为什么retainCount是2?
我从书中读到:__weak 指针将对象注册到 autoreleasepool,因此保留计数 + 1。
但是,obj1 和 obj2 指向同一个内存地址,这样的话,obj1 的 retainCount 也应该变成 2。但是,它仍然是 1。
我知道 retainCount 是不可靠的,但我很好奇这是怎么来的。 (我的环境是Xcode 8.3.3,iOS 10.3)
如果有人能向初学者解释这一点,不胜感激:)
【问题讨论】:
-
因为一个实现细节。尝试开启优化。或针对不同的平台。
retainCount不仅不可靠,而且毫无用处。事实上,输出比你提到的更令人困惑。obj1和obj2是相同的。这可能与使用/obj2进行函数调用有关。您可以随时反汇编代码并查看。 -
@mschmidt 谢谢!在那个问题中学到了很多东西。
-
@bbum retainCount 比我预期的更不可靠,谢谢!
-
这个问题不是
When to use -retainCount的重复问题。这个问题是关于实现细节的,问实现细节是合理的。