Ios ARC如何知道保留singleton对象?
当我们编写非ARC代码以创建singleton类时,它是这样的:Ios ARC如何知道保留singleton对象?,ios,objective-c,automatic-ref-counting,Ios,Objective C,Automatic Ref Counting,当我们编写非ARC代码以创建singleton类时,它是这样的: myclass * myc_ins = nil; @implementation myclass +(myclass *) getInstance { if(!myc_ins) myc_ins = [[myclass alloc] init]; return myc_ins; } // ... 但是,如果在ARC中编写相同的代码,它将释放对象,并且在一段时间后调用getInstance时,它将在
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_中的代码只执行一次,但在这种情况下,编译器如何知道保留\u实例变量?我认为应该是:
静态myclass*_实例=nil
因为它是全局的,所以不会发布(直到程序终止)。您应该更改
myclass *_instance = nil;
到
及
到
希望这有帮助
在ARC Defensionmyclass*\u实例中有用的相关堆栈溢出问题代码>表示myclass对象的强引用。所以对\u实例的每个赋值都将保留对象。
你的代码有一点修正:
static myclass *_instance = nil;
+ (myclass *)sharedInstance {
static dispatch_once_t _onceToken = 0;
dispatch_once(&_onceToken, ^{
_instance = [[myclass alloc] init];
});
return _instance;
}
我不同意arc会破坏singleton,因为仍然存在对该对象的引用。你能支持那个陈述吗?它必须是静态的。否则,如果在不同的文件中为不同的单例对象使用相同的模式,则只有一个外部变量,因此一个单例将覆盖另一个单例。最好将静态变量放在sharedInstance方法中,这样就可以保证除了通过sharedInstance之外没有其他读取方法。
myclass = [[myclass alloc] init];
_instance = [[myclass alloc] init];
static myclass *_instance = nil;
+ (myclass *)sharedInstance {
static dispatch_once_t _onceToken = 0;
dispatch_once(&_onceToken, ^{
_instance = [[myclass alloc] init];
});
return _instance;
}