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

标签 objective-c xcode reference-counting

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

相关文章:

objective-c - 返回后释放对象,这是好的做法吗?

ios - "iPhone Distribution"证书不受信任

swift - 值类型的引用循环?

xcode - 为什么 Xcode 的错误检查对我的测试文件夹不起作用?

c++ - 如何更好地为不可创建的 COM 对象初始化引用计数器?

c++ - 简单引用计数 : smart pointers

ios - 动态更改程序/VFL 约束

objective-c - OS X Lion 中类似邮件的收藏夹栏

ios - 我可以通过 textField didBeginEditing 方法 ios 导航到其他 View 吗?

iphone - 如何在不同的 View Controller 中隐藏按钮?