Objective-C 单例宏
来源:互联网 发布:java上传文件 编辑:程序博客网 时间:2024/06/05 05:22
实现
先贴出代码
也可以直接访问我的github:RWSingleton
#import <objc/runtime.h>#define RW_DECLARE_SINGLETON_FOR_CLASS_WITH_ACCESSOR(classname, accessorMethodName) \+ (classname *)accessorMethodName;#if __has_feature(objc_arc) #define RW_SYNTHESIZE_SINGLETON_RETAIN_METHODS#else #define RW_SYNTHESIZE_SINGLETON_RETAIN_METHODS \ - (id)retain \ { \ return self; \ } \ \ - (NSUInteger)retainCount \ { \ return NSUIntegerMax; \ } \ \ - (oneway void)release \ { \ } \ \ - (id)autorelease \ { \ return self; \ }#endif#define RW_SYNTHESIZE_SINGLETON_FOR_CLASS_WITH_ACCESSOR(classname, accessorMethodName) \\static classname *accessorMethodName##Instance = nil; \\+ (classname *)accessorMethodName \{ \ static dispatch_once_t onceToken;\ dispatch_once(&onceToken,^{\ accessorMethodName##Instance = [super allocWithZone:NULL]; \ accessorMethodName##Instance = [accessorMethodName##Instance init]; \ method_exchangeImplementations(\ class_getInstanceMethod([accessorMethodName##Instance class], @selector(init)),\ class_getInstanceMethod([accessorMethodName##Instance class], @selector(init_once)));\ });\ return accessorMethodName##Instance; \}\\+ (id)allocWithZone:(NSZone *)zone \{ \ return [self accessorMethodName]; \} \\- (id)copyWithZone:(NSZone *)zone \{ \ return self; \} \- (id)init_once\{ \ return self; \} \RW_SYNTHESIZE_SINGLETON_RETAIN_METHODS#define RW_DECLARE_SINGLETON_FOR_CLASS(classname) RW_DECLARE_SINGLETON_FOR_CLASS_WITH_ACCESSOR(classname, shared##classname)#define RW_SYNTHESIZE_SINGLETON_FOR_CLASS(classname) RW_SYNTHESIZE_SINGLETON_FOR_CLASS_WITH_ACCESSOR(classname, shared##classname)
使用
例如你需要一个名为MyOjbect
的单例. 在MyOjbect.h
中,代码如下:
#import "RWSingletonMacro.h"@interface MyObject : NSObjectRW_DECLARE_SINGLETON_FOR_CLASS_WITH_ACCESSOR(MyObject, sharedObject)@end
在MyObject.m
中:
#import "MyObject.h"@implementation MyObjectRW_SYNTHESIZE_SINGLETON_FOR_CLASS_WITH_ACCESSOR(MyObject, sharedObject)@end
注意
很多时候,单例都会拥有自己的instance varible
,所以这里做了method siwwizling
, 你可以重载 -(id)init
,在其中实现你的初始化逻辑.MyObject.m
看起来如下:
#import "MyObject.h"@implementation MyObjectRW_SYNTHESIZE_SINGLETON_FOR_CLASS_WITH_ACCESSOR(MyObject, sharedObject)- (id) init{ self = [super init]; //do your things return self}@end
此外,从实现中可得知,即便是如下代码也可以保证obj
是单例。
MyObject* obj = [[MyObject alloc] init];
0 0
- Objective-C 单例宏
- Objective-C
- Objective-C
- Objective-C
- Objective-c
- Objective-c
- Objective-C
- Objective-C
- Objective-C
- Objective-C
- Objective-C
- objective-c
- Objective-c
- objective-c
- Objective C
- Objective-C
- Objective-C
- Objective-C
- 正则表达式
- source, ~/.bashrc, ~/.bash_profile详解
- Ant中build.xml详细部署
- 图像视频防抖
- 项目6-ASCII
- Objective-C 单例宏
- 不同软件版本及系统的差异导致的错误汇总
- XML 数据解析案例
- 学生信息表管理
- mysql自动分区自动清理
- 简单的Java程序 简约不简单
- Liferay学习笔记:Liferay faces bridge
- 对自由变量的理解
- Android视图绘制流程完全解析,带你一步步深入了解View(二)