首页 > 其他 > 详细

41-oc单列

时间:2016-03-05 00:05:37      阅读:310      评论:0      收藏:0      [点我收藏+]

单例ARC和MRC写法

什么是单例模式

类的对象成为系统中唯一的实例,提供一个访问点,供客户类共享资源

单例就是无论怎么创建都只能有一个实例对象

 

什么情况下使用单例

 

类只能有一个实例,而且必须从一个为人熟知的访问点对其进行访问,比如工厂方法。

这个唯一的实例只能通过子类化进行扩展,而且扩展的对象不会破坏客户端代码。

 

创建单例对象的方法一般以什么开头

一般情况下创建一个单例对象都有一个与之对应的类方法

一般情况下用于创建单例对象的方法名称都以share开头, 或者以default开头

 

单例在多线程的应用

多线程中的单例

+ (instancetype)allocWithZone:(struct _NSZone *)zone

{

    // 以下代码在多线程中也能保证只执行一次

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        _instance = [[super allocWithZone:zone] init];

    });

    return _instance;

}

 


 

 单例宏抽取

如何将单例抽取成宏?如何在宏中判断当前是ARC还是MRC??

单例宏定义

以后就可以使用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

41-oc单列

原文:http://www.cnblogs.com/wc-Home/p/5243659.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!