weak singleton「弱引用单例」

原文链接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又会重新被创建。
以上.

你可能感兴趣的:(weak singleton「弱引用单例」)