gpt4 book ai didi

当指针设置为 nil 时的 Objective-C 引用计数(无 ARC)

转载 作者:行者123 更新时间:2023-12-01 22:19:59 26 4
gpt4 key购买 nike

我试图了解引用计数的工作原理,因此我禁用了 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com