码迷,mamicode.com
首页 > 其他好文 > 详细

单例设计模式

时间:2015-08-19 07:04:15      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:

单例工具类的创建
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


以后如果需要创建单例工具类直接创建一个.h文件,把上面的代码拷贝到.h文件中。在代理类中导入这个头文件。直接在单例类的.h文件中interfaceSingleton(name)传入参数和.m文件中implementationSingleton(name)传入参数即可。

单例设计模式

标签:

原文地址:http://www.cnblogs.com/wsnb/p/4741145.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!