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

iOS开发中ARC和MRC都可以用的单例模式?_第1张图片

** 单例模式- 通用版本(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 

@interface ZWJTool : NSObject


//思路:重写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都可以用的单例模式?)