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

use*_*612 2 xcode reference-counting objective-c

我试图理解引用计数是如何工作的,所以我禁用了ARC并编写了一个简单的类:( Foo.h未粘贴,因为它未被修改)

Foo.m

@implementation Foo

- (instancetype)init
{
    NSLog(@"Init object");
    return [super init];
}

- (void)dealloc
{
    NSLog(@"Dealloc object");
    [super dealloc];
}

@end
Run Code Online (Sandbox Code Playgroud)

的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;
}
Run Code Online (Sandbox Code Playgroud)

现在我希望看到dealloc object日志,因为Foo对象的唯一引用已经消失,但我得到的唯一消息是init object.

我为什么不看?分配时是否释放了对象obj = nil

mip*_*adi 5

不可以.如果您不使用ARC,则在通话时会释放该对象[obj release];.(ARC插入这些电话给你.)设置objnil什么都不做内存管理方面(虽然它创建一个对象,你不再能够到达!).

基本上,在没有ARC的Cocoa中:

  • 你打电话[obj retain],如果你想利用一个对象的所有权.(alloc这是给你的.)
  • [obj release]当您想要放弃对象的所有权时,您可以打电话.当对象的保留计数达到0时release依次调用dealloc.
  • [obj autorelease]当您想要放弃当前范围之外的对象的所有权时,可以调用.最常见的情况是,当您从方法返回一个对象(并且不想保留它的所有权)时会发生这种情况.

  • @ user2340612:是的,那是经典的内存泄漏. (3认同)