Ios 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时,它将在

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

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 Defension
myclass*\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;
}