您的位置:首页 > 移动开发 > Objective-C

Objective-C在ARC下结合GCD的单例模式和宏模版

2013-06-08 16:16 190 查看
单例模式在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];  
}  

有什么不明白的可以留言交流。

转自:容芳志 (http://blog.csdn.net/totogo2010)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: