我试图了解引用计数的工作原理,因此我禁用了 ARC 并编写了一个简单的类:(Foo.h 未粘贴,因为它未修改)
Foo.m
@implementation Foo
- (instancetype)init
{
NSLog(@"Init object");
return [super init];
}
- (void)dealloc
{
NSLog(@"Dealloc object");
[super dealloc];
}
@end
Main.m
#import <Foundation/Foundation.h>
#import "Foo.h"
int main(int argc, const char * argv[]) {
Foo *obj = [[Foo alloc] init];
obj = nil;
return 0;
}
现在我希望看到 dealloc object
日志,因为对 Foo
对象的唯一引用已经消失,但我得到的唯一消息是 init 对象
.
为什么我看不到?当我赋值obj = nil
时,对象不是被释放了吗?
最佳答案
没有。如果您不使用 ARC,则当您调用 [obj release];
时会释放该对象。 (ARC 会为您插入这些调用。)将 obj
设置为 nil
在内存管理方面没有任何作用(尽管它确实创建了一个您无法再访问的对象!)。
基本上,在没有 ARC 的 Cocoa 中:
- 如果您想获得对象的所有权,请调用
[obj keep]
。 (alloc
会为您完成此操作。) - 当您想要放弃对象的所有权时,可以调用
[obj release]
。当对象的保留计数达到 0 时,release
依次调用dealloc
。 - 当您想要放弃当前范围之外的对象的所有权时,可以调用
[obj autorelease]
。最常见的是,当您从方法返回对象(并且不想保留它的所有权)时,就会发生这种情况。
关于当指针设置为 nil 时的 Objective-C 引用计数(无 ARC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28686514/