在以下代码中,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被释放。 –
你说得对,但答案中的那句话误导了你,也许你可以改变它。 –