访问 __weak 修饰符的变量也能将其引用的对象加入 autoreleasepool?

agentgamer 发布于 2016年11月17日 | 更新于 2016年11月29日
无人欣赏。

这两天在看《Objective-C高级编程:iOS与OS X多线程和内存管理》 在第一章自动引用计数 里提到,如果访问了带 __weak 修饰符的变量的话,其引用的对象也会被加入autoreleasepool,书里还给了示例代码,但是我自己敲了一遍,发现并没有书里描述的那样(自动加入了autoreleasepool)

      @autoreleasepool {
          id __strong obj = [[NSObject alloc] init];
          _objc_autoreleasePoolPrint();
          id __weak o = obj;
          NSLog(@"before using __weak: retain count = %d", _objc_rootRetainCount(obj));
          NSLog(@"class = %@", [o class]); //根据书中描述,访问weak 变量,其引用对象被自动加入autoreleasepool
          NSLog(@"after using __weak: retain count = %d", _objc_rootRetainCount(obj));//如果obj 被加入autoreleasepool 那么此时引用计数应该是2
         _objc_autoreleasePoolPrint();//这里应该显示 obj对象已被加入了当前的autoreleasepool,但是并没有。
      }

console 输出:

objc[58700]: ##############
objc[58700]: AUTORELEASE POOLS for thread 0x10011e3c0
objc[58700]: 0 releases pending.
objc[58700]: [0x1]  ................  PAGE (placeholder)
objc[58700]: [0x1]  ################  POOL (placeholder)
objc[58700]: ##############
2016-11-17 09:56:36.238838 autoreleaseTest[58700:26276230] before using __weak: retain count = 1
2016-11-17 09:56:36.239374 autoreleaseTest[58700:26276230] class = NSObject
2016-11-17 09:56:36.239403 autoreleaseTest[58700:26276230] after using __weak: retain count = 1
objc[58700]: ##############
objc[58700]: AUTORELEASE POOLS for thread 0x10011e3c0
objc[58700]: 1 releases pending.
objc[58700]: [0x101802000]  ................  PAGE  (hot) (cold)
objc[58700]: [0x101802038]  ################  POOL 0x101802038
objc[58700]: ##############

不知道是不是苹果已经更新ARC 的机制,所以书里描述的这种行为已经不准确了?求指教。

共2条回复
agentgamer 回复于 2016年11月17日

oc 日薄西山了么T_T 自顶一下

coldguy 回复于 2016年11月29日

你这里本来就一个object,pool里也确实有一个object等待释放,这不就是你的那个__weak引用造成的吗?这是正确的结果。

NSLog(@"after using __weak: retain count = %d", objcrootRetainCount(obj));//如果obj 被加入autoreleasepool 那么此时引用计数应该是2

你改成 NSLog(@"after using __weak: retain count = %d", objcrootRetainCount(o)); 试试结果。

登录 或者 注册