weak singleton「弱引用单例」
2017-07-17 本文已影响0人
鸢飞阿诗玛
原文链接1
原文链接2
普通的单例,在被创建之后会一直存活在内存中.例如,分步注册过程中,为了多页面信息共享而创建的单例,一旦被访问,就会一直存活.实际上,这个信息在之后软件的使用过程中,是不必要的,这在一定程度上造成了内存使用的浪费.
而弱引用单例解决了这个问题,他的特别之处在于:在所有使用该单例的对象都释放后,单例对象本身也会被释放.
+ (id)sharedInstance {
static __weak ASingletonClass *instance;
ASingletonClass *strongInstance = instance;
@synchronized(self) {
if(strongInstance == nil) {
strongInstance = [[[self class] alloc] init];
instance = strongInstance;
}
}
return strongInstance;
}
分析下以上代码:
- instance : 静态局部变量,生存周期为整个程序运行期间
- strongInstance : 局部变量,生存周期为函数运行期间
我们来模拟下程序的运行场景:
ASingletonClass A = [ASingletonClass sharedInstance];
//创建了一个新的ASingletonClass对象,instance持有弱引用该对象
ASingletonClass B = [ASingletonClass sharedInstance];
//从instance中获取了ASingletonClass单例对象的引用
A = nil;
B = nil;
//ASingletonClass单例对象只被instance弱引用,被销毁
weak singleton简单而巧妙的利用了weak特性,在无人使用 instance 之后就自动销毁,当sharedInstance再次被调用时,instance又会重新被创建。
以上.