zoukankan      html  css  js  c++  java
  • ARC和MRC 兼容的单例模式

    一、ARC下的单例实现

      说明:在用户实例化的方法控制单次执行,同时开放单例的初始化方法。

    复制代码
    -(instancetype)init{
    
        self=[super init];
        if(self){
            static dispatch_once_t onceToken;
            dispatch_once(&onceToken, ^{
            });
        }
        return self;
        
    
    }
    
    static id instance; 
    +(instancetype)allocWithZone:(struct _NSZone *)zone{ 
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{ 
        instance=[super allocWithZone:zone]; 
        }); 
    return instance;
    } 
     
     
    + (instancetype) shareAudio{
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{ 
        instance=[[self alloc]init]; 
        }); 
        return instance; 
    } 
     
    +(id)copyWithZone:(struct _NSZone *)zone{ 
        return instance;
    }
    复制代码
    二、MRC下的单例实现

       说明:在用户实例化的方法控制单次执行,同时开放单例的初始化方法,由于当前为MRC所以需要控制参内存管理的方法单次执行,因此相比ARC需要增加:

    复制代码
    static id instance; 
    +(instancetype)allocWithZone:(struct _NSZone *)zone{ 
        static dispatch_once_t onceToken; 
        dispatch_once(&onceToken, ^{ 
            instance=[super allocWithZone:zone]; 
        }); 
        return instance; 
    } 
     
     
    + (instancetype) shareAudio{
        static dispatch_once_t onceToken; 
        dispatch_once(&onceToken, ^{ 
            instance=[[self alloc]init]; 
        }); 
        return instance; 
    } 
    -(oneway void)release{ 
    } 
     
    -(instancetype)autorelease{ 
        return instance; 
    } 
     
    -(instancetype)retain{ 
        return instance; 
    } 
     
    -(NSUInteger)retainCount{ 
        return 1; 
    }
    复制代码
    三、兼容MRC 和ARC的宏定义

       说明:为了方便后期的引用,可以将单例抽取为宏定义,鉴于抽取的时候考虑到当前的手动计数和自动计数因此引入条件编译:

    复制代码
    #if !__has_feature(objc_arc)
    ======当前是ARC
    #else
    ======当前是MRC
    #endif
    
    代码:
    #define singleton_h(name)  + (instancetype) share##name;
    
    
    #if !__has_feature(objc_arc)
    #define singleton_m(name)
     static id instance;
    +(instancetype)allocWithZone:(struct _NSZone *)zone{
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            instance=[super allocWithZone:zone];
        });
        return instance;
    }
    
    
    + (instancetype) share##name{
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            instance=[[self alloc]init];
        });
        return instance;
    }
    -(oneway void)release{
    }
    
    -(instancetype)autorelease{
        return instance;
    }
    
    -(instancetype)retain{
        return instance;
    }
    
    +(id)copyWithZone:(struct _NSZone *)zone{
        return instance;
    }
    -(NSUInteger)retainCount{
        return 1;
    }
    
    #else
    
    #define singleton_m(name)
    static id instance;
    +(instancetype)allocWithZone:(struct _NSZone *)zone{
      static dispatch_once_t onceToken;
      dispatch_once(&onceToken, ^{
      instance=[super allocWithZone:zone];
    });
      return instance;
    }
    
    
    + (instancetype) share##name{
      static dispatch_once_t onceToken;
      dispatch_once(&onceToken, ^{
       instance=[[self alloc]init];
      });
      return instance;
    }
    
    +(id)copyWithZone:(struct _NSZone *)zone{
       return instance;
    }
    #endif
    复制代码
    四、文件引用

    1 在.h文件引用singleton_h(audio);

    2 在.m文件引用singleton_m(audio);

  • 相关阅读:
    从程序设计到软件工程
    必应词典客户端软件测试报告
    软工第二次阅读作业:软件开发的轻与重
    结对编程2:电梯调度程序的UI设计 心得文档
    [MVC]如何提升命名空间的优先级
    asp,net 实现treeview 选种父节点其子节点也选种
    asp.net jmail发送邮件代码
    mysql workbench建表时的字段选项含义
    C#/.NET中的委托与事件
    C# 处理日期时间
  • 原文地址:https://www.cnblogs.com/tangshiguang/p/6753620.html
Copyright © 2011-2022 走看看