当我们编写非 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
变量?
最佳答案
在 ARC 定义中 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;
}
关于ios - ARC如何知道保留单例对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23442262/