0

代码:

@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)”?

4

1 回答 1

1

为什么 obj 在内部 @autoreleasepool 块中而不是在外部自动释放?

该对象在分配给obj( obj = [[NSObject alloc] init];) 时被自动释放,因此它被放入最顶层(最里面)的自动释放池中,并在该池耗尽时(在@autoreleasepool块的末尾)被释放。

如果保留计数为 1,为什么 NSLog 输出“(null)”?

_objc_rootRetainCount()不是记录在案的功能。显然_objc_rootRetainCount(nil)评估为 1。

于 2013-05-12T22:30:52.280 回答