当我们编写非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
变量?
答案 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