1

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

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

    return __sharedInstance;
}

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

这是在 ARC 下,所以编译器什么时候释放 SomeClass 静态对象?它是否保证在我的应用程序的剩余生命周期中都存在?

4

1 回答 1

6

由于 的声明__sharedInstancesharedInstance的范围内,因此不能被任何其他方法直接访问。这意味着没有其他人可以将其设置为nil,因此它将一直保留到您的应用程序终止为止。

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

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