在以下代碼中,ARC'd在Mac OS X 10.8.4上運行64位,爲什麼MyObj實例在程序終止之前未被釋放?爲什麼在自動釋放池之外使用__weak引用它們時不會釋放對象?
#import <Foundation/Foundation.h>
@interface MyObj : NSObject
@end
@implementation MyObj
- (void)dealloc
{
NSLog(@"MyObj dealloc'd %p", self);
}
@end
int main(int argc, const char * argv[])
{
MyObj* obj1 = [[MyObj alloc] init];
__weak MyObj* weakObj1 = obj1;
NSLog(@"Use it: %p\n", weakObj1);
// Why isn't MyObj deallocated here?
return 0;
}
*「對象或變量將被釋放,一旦它聲明的塊結束」* - 這是錯誤的。一個*強參考*將在該塊的結尾處發佈。如果最後一個強引用被釋放,該對象將被釋放。但'__weak MyObj * weakObj1 = obj1;'創建一個*弱引用*,不會增加保留計數。 –
weakObj1對obj1的引用較弱,表示weakObj1不會增加obj1的保留計數;但這並不意味着弱Obj1本身沒有保留計數。這個保留計數將在創建對象時保留一次,並且直到它減少到0時纔會被釋放。在ARC中,它仍然取決於autoreleasepool被釋放。 –
你說得對,但答案中的那句話誤導了你,也許你可以改變它。 –