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

alo*_*loo 1 singleton objective-c grand-central-dispatch ios

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

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

    return __sharedInstance;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Sta*_*ort 6

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

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

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

  • +1你忘了一个细节;*这是共享实例的一项功能; 根据定义,在应用程序的运行会话期间不应取消分配它们.如果您的申请被终止,系统将自动回收任何资源.* (3认同)
  • 更强烈,正如@maddy所暗示的那样; 除非你的程序违反了内存管理模式,否则保证你的`dealloc`方法*不会被调用*给定代码. (2认同)