2013-07-16 16 views
1

我使用的是常见的单例模式如下:然而ARC下sharedInstance模式的内存含义是什么?

+ (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静态对象?它保证在我的应用程序的其余生命周围?

回答

6

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

另外值得一提的是,你不能确定,当系统释放你上终止内存你单身的dealloc方法将被调用,这主要是因为:

  1. 操作系统本身可以处理的终止过程,在这种情况发生之前,没有Objective-C运行时调用您的dealloc方法。假设你确实得到了一个dealloc方法,那么当终止时你不能预测对象销毁的顺序(比如你使用的框架),使你的代码不可靠。
+3

+1你忘了一个细节; *这是共享实例的功能;根据定义,它们不应该在应用程序的运行会话期间被释放。如果您的应用程序已终止,系统将自动回收所有资源。* – bbum

+1

由于默认情况下静态变量为'强',对象将由ARC保留。这是让对象在整个持续时间内保持活跃的原因。 – rmaddy

+2

更强烈,并@maddy暗示;保证你的'dealloc'方法不会被调用,除非你的程序违反了内存管理模式。 – bbum