美文网首页
iOS单例写法的记录

iOS单例写法的记录

作者: timeQuick | 来源:发表于2019-03-29 10:12 被阅读0次

    在工程中经常会写一个单例模式,写单例中一般主要考虑下面几点

    • 防止调用 alloc]init]引起的问题(分配内存地址不唯一)
    • 防止调用 new 引起的问题
    • 防止调用 copy 引起的问题(不常用)
    • 防止调用 mutableCopy 引起的问题(不常用)

    当然有些还要考虑ARC,MRC下的写法不同。这里不讨论MRC下的写法,只记录自己在工程中的常用两种写法。

    第一种方法

    实现copy,mutableCopy方法,至于为什么用_netWorkService = [[super allocWithZone:NULL] init]; 网上一这篇文章写得很清楚 Objective-C中Alloc和AllocWithZone

    + (instancetype)sharedInstance {
        static NetWorkService * _netWorkService = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            //不能再使用alloc方法
            //因为已经重写了allocWithZone方法,所以这里要调用父类的分配空间的方法
            _netWorkService = [[super allocWithZone:NULL] init];
        });
        return _netWorkService;
    }
    + (id)allocWithZone:(struct _NSZone *)zone{
        return [NetWorkService sharedInstance];
    }
    
    - (id)copyWithZone:(NSZone *)zone {
         return [NetWorkService sharedInstance];
    }
    
    -(id)mutableCopyWithZone:(NSZone *)zone{
         return [NetWorkService sharedInstance];
    }
    

    第二种方法

    在.m中这样写

    + (instancetype)sharedInstance {
        static NetWorkService * _netWorkService = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _netWorkService = [[self alloc] init];
        });
        return _netWorkService;
    }
    

    在.h中禁外部调用copy等方法

    - (instancetype)init NS_UNAVAILABLE;
    + (instancetype)new NS_UNAVAILABLE;
    - (id)copy NS_UNAVAILABLE; // 没有遵循协议可以不写
    - (id)mutableCopy NS_UNAVAILABLE; // 没有遵循协议可以不写
    

    总结

    自己常用的是第二种方法

    相关文章

      网友评论

          本文标题:iOS单例写法的记录

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