美文网首页
最健壮的单例

最健壮的单例

作者: i爱吃土豆的猫 | 来源:发表于2021-04-15 20:13 被阅读0次

    单例的健壮性
    要是自己用的话,直接用shareInstance方法创建没啥问题,但是如果同组或者别人没注意用alloc创建、或者别人不小心使用copy、mutableCopy就可能产生两个实例,也就不存在单例。健壮性就是要保持怎么创建就这个实力,就返回位子的内存地址。

    // 实现copy协议
    @interface SignalModel()<NSCopying, NSMutableCopying>
    
    @end
    
    
    + (instancetype)shareInstance {
        static Singleton * _instance = nil;
        static dispatch_once_t onceToken ;
        dispatch_  once(&onceToken, ^{
        _instance = [[super allocWithZone:NULL]  init] ;
        //不是使用alloc方法,而是调用[[super allocWithZone:NULL] init] 
        //已经重载allocWithZone基本的对象分配方法,所以要借用父类(NSObject)的功能来帮助出处理底层内存分配的杂物
        }) ;
        return _instance ;
    }
    
    //用alloc返回也是唯一实例
    +(id) allocWithZone:(struct _NSZone *)zone {
        return [Singleton shareInstance] ;
    }
    //对对象使用copy也是返回唯一实例
    -(id)copyWithZone:(NSZone *)zone {
          return [Singleton shareInstance] ;//return _instance;
    }
    //对对象使用mutablecopy也是返回唯一实例
    -(id)mutableCopyWithZone:(NSZone *)zone {
           return [Singleton shareInstance] ;
    }
    @end    
    

    上面代码注意点:

    1. 当static关键字修饰局部变量时,只会初始化一次且在程序中只有一份内存
    2. copyWithZone mutablecopyWithZone 这个类遵守<NSCopying,NSMutableCopying>协议
    3. 如果_instance = [self alloc] init];创建的话,将会和-(id) allocWithZone:(struct _NSZone *)zone产生死锁。 dispatch_once中的onceToken线程被阻塞,等待onceToken值改变。
    4. 当用alloc创建对象、以及对对象进行copy mutableCopy也是返回唯一实例

    相关文章

      网友评论

          本文标题:最健壮的单例

          本文链接:https://www.haomeiwen.com/subject/omboihtx.html