单例设计模式
2015-08-19 01:43
197 查看
单例工具类的创建
1.利用一次性代码
2.不可以通过继承的方式,使子类成为单例。如果继承,会引发如下两个问题
- 如果先创建父类,那么子类创建出来的对象也永远是父类
- 如果先创建子类,那么父类创建出来的对象也永远是子类
3.宏定义抽取单例:
方法的声明
方法的实现
用以下方法判断是否是ARC
// 以后就可以使用interfaceSingleton来替代后面的方法声明
以后如果需要创建单例工具类直接创建一个Singleton.h文件,把上面的代码拷贝到.h文件中。在单例类(拿Person类为例)中导入这个头文件。直接在单例类的.h文件中interfaceSingleton(name)传入参数,.m文件中implementationSingleton(name)传入参数即可。
如下:
1.利用一次性代码
static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ <#code to be executed once#> });
2.不可以通过继承的方式,使子类成为单例。如果继承,会引发如下两个问题
- 如果先创建父类,那么子类创建出来的对象也永远是父类
- 如果先创建子类,那么父类创建出来的对象也永远是子类
3.宏定义抽取单例:
方法的声明
方法的实现
用以下方法判断是否是ARC
#if __has_feature(objc_arc) #else #endif
// 以后就可以使用interfaceSingleton来替代后面的方法声明
#define interfaceSingleton(name) +(instancetype)share##name #if __has_feature(objc_arc) // ARC #define implementationSingleton(name) \ + (instancetype)share##name \ { \ name *instance = [[self alloc] init]; \ return instance; \ } \ static name *_instance = nil; \ + (instancetype)allocWithZone:(struct _NSZone *)zone \ { \ static dispatch_once_t onceToken; \ dispatch_once(&onceToken, ^{ \ _instance = [[super allocWithZone:zone] init]; \ }); \ return _instance; \ } \ - (id)copyWithZone:(NSZone *)zone{ \ return _instance; \ } \ - (id)mutableCopyWithZone:(NSZone *)zone \ { \ return _instance; \ } #else // MRC #define implementationSingleton(name) \ + (instancetype)share##name \ { \ name *instance = [[self alloc] init]; \ return instance; \ } \ static name *_instance = nil; \ + (instancetype)allocWithZone:(struct _NSZone *)zone \ { \ static dispatch_once_t onceToken; \ dispatch_once(&onceToken, ^{ \ _instance = [[super allocWithZone:zone] init]; \ }); \ return _instance; \ } \ - (id)copyWithZone:(NSZone *)zone{ \ return _instance; \ } \ - (id)mutableCopyWithZone:(NSZone *)zone \ { \ return _instance; \ } \ - (oneway void)release \ { \ } \ - (instancetype)retain \ { \ return _instance; \ } \ - (NSUInteger)retainCount \ { \ return MAXFLOAT; \ } #endif
以后如果需要创建单例工具类直接创建一个Singleton.h文件,把上面的代码拷贝到.h文件中。在单例类(拿Person类为例)中导入这个头文件。直接在单例类的.h文件中interfaceSingleton(name)传入参数,.m文件中implementationSingleton(name)传入参数即可。
如下:
#import <Foundation/Foundation.h> #import "Singleton.h" @interface Person : NSObject interfaceSingleton(Person); @end
#import "Person.h" @implementation Person implementationSingleton(Person) @end
相关文章推荐
- 3D该来的还是会来的
- 1.具体工厂模式
- POJ 1789 解题报告
- 第三方微博登陆,通过OAuth c21e 2.0 进行授权
- Commen
- 怎样布局网站关键词最合理
- python-装饰器
- 33
- 用一句Linq把一个集合的属性值根据条件改了,其他值不变
- POJ 1328 Radar Installation
- hibernate向mysql插入中文乱码问题
- [读书笔记—程序员]《高效程序员的45个习惯:敏捷开发修炼之道》- 苏帕拉马尼亚姆,亨特
- HDU 1394 Minimum Inversion Number (线段树,单点更新)
- C++ 学习博客链接
- Pick-up sticks(线段相交判断+剪枝)
- c unistd.h说明
- JDK的安装以及配置
- JDK的安装以及配置
- HDU 1548 (第一次的BFS)
- 2.抽象工厂模式