美文网首页
iOS开发中ARC和MRC都可以用的单例模式?

iOS开发中ARC和MRC都可以用的单例模式?

作者: 随心吧 | 来源:发表于2017-02-20 13:56 被阅读49次

    ** 单例模式- 通用版本(ARC&MRC)**

    • (1)有意思的对话

    •  01 问:写一份单例代码在ARC和MRC环境下都适用?
      
    答:可以使用条件编译来判断当前项目环境是ARC还是MRC
    
    • 02 问:条件编译的代码呢,么么哒?
      
    //答:条件编译
    #if __has_feature(objc_arc)
    //如果是ARC,那么就执行这里的代码1
    #else
    //如果不是ARC,那么就执行代理的代码2
    #endif
    
    • 03 问:在项目里面往往需要实现很多的单例,比如:下载、网络请求、音乐播放等等,弱弱的问一句单例可以用继承吗?
    答:单例是"不可以"用继承的,如果想一次写就,四处使用,那么推荐亲使用带参数的宏定义啦!
    
    • 04 问:宏定义怎么弄?
    答:这个嘛~~回头看一眼我的代码咯,亲。
    

    下载:单例模式demo(ARC和MRC环境下通用)

    **(2)使用带参数的宏完成通用版单例模式代码 **

     01 注意:条件编译的代码,不能包含在宏定义里面
     02 宏定义的代码只需要写一次就好,之后直接拖到项目中用就OK
    

    (3 )代码如下:

    • (01) .h文件
    #import <Foundation/Foundation.h>
    
    @interface ZWJTool : NSObject<NSMutableCopying,NSCopying>
    
    
    //思路:重写alloc /new (内部进行alloc分配空间,init对象初始化); (严谨)copy/mutablCopy  方法
    
    //1 :重写alloc即:allocWithZone
    +(instancetype)allocWithZone:(struct _NSZone *)zone;
    
    //2 :提供一个外界访问的类+
    + (instancetype )shareTool;
    //3 :重写release+retain方法(MRC)
    @end
    
    • (02).m文件
    
    #import "ZWJTool.h"
    
    @implementation ZWJTool
    //修改环境ARC-MRC buildSetting——automatic
    
    //思路:重写alloc /new (内部进行alloc分配空间,init对象初始化); (严谨)copy/mutablCopy  方法
    
    //1 :重写alloc即:allocWithZone
    //2 :提供一个外界访问的类
    //3 :严谨:copy和mutablaCopy进行处理
    // 4 ;重写release方法;重写retain方法
    
    
    
    
    //0 .创建一个局部访问对象
     static   ZWJTool *_instance;
    
    //1 :重写alloc即:allocWithZone
    +(instancetype)allocWithZone:(struct _NSZone *)zone
    {
    
        //实现在整个程序运行过程中,只初始化一次
        /*
         1.1 懒加载 (保证建立一次,不能保证资源竞争) pass
         
         1.2 锁 sycn  建议
         1.3 GCD一次函数 建议
         
         */
        
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _instance = [super allocWithZone: zone];
        });
    
        return _instance;
    }
    
    
    //2 :提供一个外界访问的类
    + (instancetype )shareTool
    {
    
        return [[self alloc] init ];
    }
    
    //3 :严谨:copy和mutablaCopy进行处理
    
    -(id)mutableCopyWithZone:(NSZone *)zone
    {
        return _instance;
    
    }
    -(id)copyWithZone:(NSZone *)zone
    {
    
        return _instance;
    }
    
    #pragma mark - 条件编译
    
    //条件满足ARC
    # if __has_feature(objc_arc)
    //否则执行MAC
    # else
    
    -(instancetype)retain
    {
    
        return _instance;
    }
    -(oneway void)release
    {
    
    }
    //约定习惯,非arc情况为最大值,告诉是单利
    -(NSUInteger)retainCount
    {
        return MAXFLOAT;
    
    }
    # endif
    
    @end
    

    相关文章

      网友评论

          本文标题:iOS开发中ARC和MRC都可以用的单例模式?

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