ARC如何知道保留单例对象?

时间:2014-05-03 08:56:49

标签: ios objective-c automatic-ref-counting

当我们编写非ARC代码以创建单例类时,它会是这样的:

myclass * myc_ins = nil;
@implementation myclass
+(myclass *) getInstance {
    if(!myc_ins) 
        myc_ins = [[myclass alloc] init];
    return myc_ins;
}
// ...

但是,如果在ARC中写入相同的代码,它会释放该对象,并且在一段时间后调用getInstance时,它将返回一些悬空指针,因为指向的内存被释放。 另外,我已经看到ARC应用程序的这段代码:

myclass *_instance = nil;
+ (myclass *)sharedInstance {
    static dispatch_once_t _onceToken = 0;
    dispatch_once(&_onceToken, ^{
        myclass = [[myclass alloc] init];
    });
    return _instance;
}

尽管dispatch_once中的代码执行一次,但在这种情况下编译器如何知道保留_instance变量?

3 个答案:

答案 0 :(得分:3)

在ARC defenition中myclass *_instance;表示对myclass对象的强引用。因此,_instance的每个作业都将保留对象。 你的代码有一些纠正:

static myclass *_instance = nil;

+ (myclass *)sharedInstance {
    static dispatch_once_t _onceToken = 0;
    dispatch_once(&_onceToken, ^{
       _instance = [[myclass alloc] init];
       });
    return _instance;
}

答案 1 :(得分:1)

我认为应该是:

  

static myclass * _instance = nil;

并且因为它是全局的,所以它不会被释放(直到程序终止)。

答案 2 :(得分:1)

你应该改变

myclass *_instance = nil;

static myclass *_instance = nil;

myclass = [[myclass alloc] init];

_instance = [[myclass alloc] init];

希望得到这个帮助。

有用的相关stackoverflow问题here