ARC下sharedInstance模式的内存含义是什么?

时间:2013-07-16 05:44:18

标签: ios objective-c singleton grand-central-dispatch

我正在使用常见的单例模式如下:

+ (SomeClass *)sharedInstance {
    static SomeClass *__sharedInstance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        __sharedInstance = [[SomeClass alloc] init];
    });

    return __sharedInstance;
}

我知道SomeClass对象在第一次调用[SomeClass sharedInstance]时会被实例化,但是, SomeClass什么时候被dealloc'd?

这是在ARC下,所以编译器何时释放SomeClass静态对象?是否保证在我的应用程序的剩余生命周期内出现?

1 个答案:

答案 0 :(得分:6)

由于__sharedInstance的声明在sharedInstance范围内,因此无法通过任何其他方法直接访问它。这意味着没有其他人可以将其设置为nil,因此会一直保留到您的应用终止为止。

还值得一提的是,当系统在终止时释放内存时,您无法确定单个人的dealloc方法是否会被调用,主要是因为:

  1. 操作系统本身可以处理进程的终止,而没有Objective-C运行时在此之前调用dealloc方法。
  2. 假设您确实获得了dealloc方法,那么在终止时(例如您使用的框架)无法预测对象破坏的顺序,从而使您的代码不可靠。