这两天在看《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 的机制,所以书里描述的这种行为已经不准确了?求指教。