程序员应该如何保障自己的利益?

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

agentgamer 发布于 3月前 | 更新于 2月前
无人欣赏。

这两天在看《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 回复于 3月前

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

coldguy 回复于 2月前

你这里本来就一个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)); 试试结果。

登录 或者 注册
相关帖子
格式建议
  • 本站使用 Markdown 格式,想了解这一格式请阅读:《用Markdown语法写文章》
  • 内容框下有实时预览框,请预览后发帖。
  • 文字前面请不要空4个英文空格
  • 每段文字之间请回两次车
  • 贴代码前点击左侧工具栏的“贴代码”按钮(
    ),然后在出现的“enter code here”处贴入你的代码。
  • 回复特定回复的时候,请点击该回复右侧的回复链接,系统将自动创建楼号和@通知。
  • @他人的时候注意,id后面请加一个空格。
  • 使用左侧工具栏“贴链接”按钮(
    )创建的优酷、土豆、youtube视频链接,将自动生成播放区域,不需要使用其他包含方式。
  • 如果要创作长篇格式复杂的帖子,本站建议Mac用户使用Mou软件,离线写好,贴入即可。