代码:
@autoreleasepool {
id __autoreleasing obj = nil;
@autoreleasepool {
obj = [[NSObject alloc] init];
_objc_autoreleasePoolPrint();
}
NSLog(@"obj: %@", obj); // Error
_objc_autoreleasePoolPrint();
}
来自 Clang 文档:
For __autoreleasing objects, the new pointee is retained, autoreleased, and stored into the lvalue using primitive semantics.
为什么 obj 在内部 @autoreleasepool 块中而不是在外部自动释放?
第二个例子:
@autoreleasepool {
id __weak obj = nil;
@autoreleasepool {
id __strong obj1 = [[NSObject alloc] init];
obj = obj1;
NSLog(@"obj: %@", obj); // <NSObject: 0x7857657>
NSLog(@"obj retain count: %d", (int) _objc_rootRetainCount(obj1)); // 2
_objc_autoreleasePoolPrint();
}
NSLog(@"obj retain count: %d", (int) _objc_rootRetainCount(obj)); // 1
NSLog(@"obj: %@", obj); // (null)
_objc_autoreleasePoolPrint();
}
如果保留计数为 1,为什么 NSLog 输出“(null)”?