Objective-C 单例宏

原创 2015年11月18日 15:52:31

实现

先贴出代码
也可以直接访问我的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 : NSObject
RW_DECLARE_SINGLETON_FOR_CLASS_WITH_ACCESSOR(MyObject, sharedObject)
@end

MyObject.m中:

#import "MyObject.h"
@implementation MyObject
RW_SYNTHESIZE_SINGLETON_FOR_CLASS_WITH_ACCESSOR(MyObject, sharedObject)
@end

注意

很多时候,单例都会拥有自己的instance varible,所以这里做了method siwwizling, 你可以重载
-(id)init,在其中实现你的初始化逻辑.MyObject.m看起来如下:

#import "MyObject.h"
@implementation MyObject
RW_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];
版权声明:本文为博主原创文章,未经博主允许不得转载。

Objective-C 常用宏, 自定义log, 单例, GCD,Socket,RGB

#ifndef PrefixHeader_pch #define PrefixHeader_pch #pragma mark - ==================== 头文件 #import ...

【深入浅出Objective-C】7.2单例和深拷贝

1.单例: #import @interface MySingletonClass : NSObject @end #import "MySingletonClass.h" @implem...

Objective-c ;单例设计模式

Objective-c 单例设计模式(Singleton) 一、什么是单例模式:(Singleton)      单例模式的意图是是的类的对象成为系统中唯一的实例,提供一个访问点,供客户类共享资源...
  • xyzs996
  • xyzs996
  • 2013年09月22日 10:44
  • 693

iOS开发-Objective-C单例在ARC环境下的实现和理解

objective-c语言arc环境下的单例到底应该怎么实现呢?为什么呢?如何保证使用alloc,init,new,copy,mutableCopy等方法实例化出来的对象,依然是那个单例对象呢?...

Objective-C单例设计模式

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系...

Objective-C编程之道iOS设计模式单例解析(1)

本文对《Objective-C编程之道iOS设计模式解析》一书中第七章的单例模式进行粗略的研究,总结了一些objective-c实现单例模式子类化相关的内容。首次发博客到CSDN首页,期待和大家多多交...

【Objective-C】OC中单例设计模式讲解

基本概念:        单例设计模式是运用较为普遍,广泛且较为简单的设计模式之一,它的设计原理是 始终返回一个实例,即一个类始终只有一个实例 创建单例设计模式的基本步骤       1...

Objective-c 单例设计模式(Singleton)

一、什么是单例模式:(Singleton)      单例模式的意图是是的类的对象成为系统中唯一的实例,提供一个访问点,供客户类共享资源。 二、什么情况下使用单例?      1、类只能...

Objective-C 中的单例

其实对于单例,在程序开发中非常的常见。 最近我也对单例进行了一些更细致的研究。 在我的程序中,单例一般是这么去写的: + (DataSource *)shareInstance {     ...

Objective-C学习-单例以及通知中心(NotificationCenter)

单例       单例是什么呢,简单的来说就是一块全局唯一的内存,通俗的来讲就是一块全局共用的内存,那么单例有什么用呢,楼主表示基本上自己写过的单例大多数都是用来传值的或者打包成一个功能性的类,当然方...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Objective-C 单例宏
举报原因:
原因补充:

(最多只允许输入30个字)