Objective-C在ARC下结合GCD的单例模式和宏模版
2016-01-11 11:18
513 查看
http://blog.csdn.net/totogo2010/article/details/8373642
单例模式在iOS开发过程中经常用到,苹果提供过objective c单例的比较官方的写法:
[cpp] view
plaincopy
static MyGizmoClass *sharedGizmoManager = nil;
+ (MyGizmoClass*)sharedManager
{
@synchronized(self) {
if (sharedGizmoManager == nil) {
[[self alloc] init]; // assignment not done here
}
}
return sharedGizmoManager;
}
+ (id)allocWithZone:(NSZone *)zone
{
@synchronized(self) {
if (sharedGizmoManager == nil) {
sharedGizmoManager = [super allocWithZone:zone];
return sharedGizmoManager; // assignment and return on first allocation
}
}
return nil; //on subsequent allocation attempts return nil
}
- (id)copyWithZone:(NSZone *)zone
{
return self;
}
- (id)retain
{
return self;
}
- (unsigned)retainCount
{
return UINT_MAX; //denotes an object that cannot be released
}
- (void)release
{
//do nothing
}
- (id)autorelease
{
return self;
}
现在iOS5之后普遍使用了ARC技术,原来这个写法就显得很累赘了,release已经不使用了。
咱们可以结合GCD来实现单例模式:
[cpp] view
plaincopy
+ (id)sharedInstance
{
static dispatch_once_t pred = 0;
__strong static id _sharedObject = nil;
dispatch_once(&pred, ^{
_sharedObject = [[self alloc] init]; // or some other init method
});
return _sharedObject;
}
使用dispatch_once,这个方法的意思是在应用程序生命周期内,这方法只执行一次,这就是ARC下结合GCD的一个单例的代码
因为我们可能需要多个单例的类,每个都写一次比较麻烦,可以更方便一些,把这些代码写成宏的形式,只需要传入类名就可以创建一个单例的类了。
通过传入类名创建头文件中单例方法的名称:
[cpp] view
plaincopy
#define DEFINE_SINGLETON_FOR_HEADER(className) \
\
+ (className *)shared##className;
通过传入类名创建单例方法的实现
[cpp] view
plaincopy
#define DEFINE_SINGLETON_FOR_CLASS(className) \
\
+ (className *)shared##className { \
static className *shared##className = nil; \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
shared##className = [[self alloc] init]; \
}); \
return shared##className; \
}
使用宏:
在项目中新建了一个类testSingleton,并且有.h 和.m文件。
.h
.m中的代码:
[cpp] view
plaincopy
#import "testSingleton.h"
@implementation testSingleton
DEFINE_SINGLETON_FOR_CLASS(testSingleton)
@end
[cpp] view
plaincopy
#define DEFINE_SINGLETON_FOR_HEADER(className) \
\
+ (className *)shared##className;
#define DEFINE_SINGLETON_FOR_CLASS(className) \
\
+ (className *)shared##className { \
static className *shared##className = nil; \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
shared##className = [[self alloc] init]; \
}); \
return shared##className; \
}
#import <Foundation/Foundation.h>
@interface testSingleton : NSObject
DEFINE_SINGLETON_FOR_HEADER(testSingleton);
@end
你可以把宏单独放到项目管理宏的文件中。这里是为了方便演示放到和testSingleton.h文件了。
获取单例:
[cpp] view
plaincopy
- (void)test
{
testSingleton *testShare = [testSingleton sharedtestSingleton];
}
有什么不明白的可以留言交流。
单例模式在iOS开发过程中经常用到,苹果提供过objective c单例的比较官方的写法:
[cpp] view
plaincopy
static MyGizmoClass *sharedGizmoManager = nil;
+ (MyGizmoClass*)sharedManager
{
@synchronized(self) {
if (sharedGizmoManager == nil) {
[[self alloc] init]; // assignment not done here
}
}
return sharedGizmoManager;
}
+ (id)allocWithZone:(NSZone *)zone
{
@synchronized(self) {
if (sharedGizmoManager == nil) {
sharedGizmoManager = [super allocWithZone:zone];
return sharedGizmoManager; // assignment and return on first allocation
}
}
return nil; //on subsequent allocation attempts return nil
}
- (id)copyWithZone:(NSZone *)zone
{
return self;
}
- (id)retain
{
return self;
}
- (unsigned)retainCount
{
return UINT_MAX; //denotes an object that cannot be released
}
- (void)release
{
//do nothing
}
- (id)autorelease
{
return self;
}
现在iOS5之后普遍使用了ARC技术,原来这个写法就显得很累赘了,release已经不使用了。
咱们可以结合GCD来实现单例模式:
[cpp] view
plaincopy
+ (id)sharedInstance
{
static dispatch_once_t pred = 0;
__strong static id _sharedObject = nil;
dispatch_once(&pred, ^{
_sharedObject = [[self alloc] init]; // or some other init method
});
return _sharedObject;
}
使用dispatch_once,这个方法的意思是在应用程序生命周期内,这方法只执行一次,这就是ARC下结合GCD的一个单例的代码
因为我们可能需要多个单例的类,每个都写一次比较麻烦,可以更方便一些,把这些代码写成宏的形式,只需要传入类名就可以创建一个单例的类了。
通过传入类名创建头文件中单例方法的名称:
[cpp] view
plaincopy
#define DEFINE_SINGLETON_FOR_HEADER(className) \
\
+ (className *)shared##className;
通过传入类名创建单例方法的实现
[cpp] view
plaincopy
#define DEFINE_SINGLETON_FOR_CLASS(className) \
\
+ (className *)shared##className { \
static className *shared##className = nil; \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
shared##className = [[self alloc] init]; \
}); \
return shared##className; \
}
使用宏:
在项目中新建了一个类testSingleton,并且有.h 和.m文件。
.h
.m中的代码:
[cpp] view
plaincopy
#import "testSingleton.h"
@implementation testSingleton
DEFINE_SINGLETON_FOR_CLASS(testSingleton)
@end
[cpp] view
plaincopy
#define DEFINE_SINGLETON_FOR_HEADER(className) \
\
+ (className *)shared##className;
#define DEFINE_SINGLETON_FOR_CLASS(className) \
\
+ (className *)shared##className { \
static className *shared##className = nil; \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
shared##className = [[self alloc] init]; \
}); \
return shared##className; \
}
#import <Foundation/Foundation.h>
@interface testSingleton : NSObject
DEFINE_SINGLETON_FOR_HEADER(testSingleton);
@end
你可以把宏单独放到项目管理宏的文件中。这里是为了方便演示放到和testSingleton.h文件了。
获取单例:
[cpp] view
plaincopy
- (void)test
{
testSingleton *testShare = [testSingleton sharedtestSingleton];
}
有什么不明白的可以留言交流。
相关文章推荐
- 编译错:The method createSqlQuery(String, List<Object>) is ambiguous for the type
- django TypeError: 'module' object is not callable
- #Objective - C - UI-design - 第七天 -UIKit框架-UIKit-导航控制器-UINavigationController
- 理解Objective-C的变量以及面相对象的继承特性
- Objective-c的内存管理MRC与ARC
- iOS完全自学手册——[三]Objective-C语言速成,利用Objective-C创建自己的对象
- [Objective-C] 021 KVC、KVO
- 《Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法》--读书笔记
- [6]姥爷幽默谈Objective-C-文件操作类NSFileManager,NSFileHandle
- Mybatis——MetaObject学习
- Objective-C下的NSCoding协议
- object-c 新旧两种弹出框
- [5]姥爷幽默谈Objective-C-字符串(NSString)
- Objective-c下的深拷贝、浅拷贝以及NSCopying协议
- Objective-c开发--MRC和ARC混编--(iOS开发)
- 论文提要“You Only Look Once: Unified, Real-Time Object Detection”
- iOS开发之Objective-C与JavaScript的交互
- Objective-C 9 常用结构体
- Objective-c下变量和属性的区别
- object-c所有知识点集合