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