美文网首页
Objective-C 宏定义单例

Objective-C 宏定义单例

作者: 4fbc4e24081a | 来源:发表于2017-11-28 11:35 被阅读0次

    单例设计模式是开发中经常会被用到的一种设计模式,而且有时候一个项目中会用到多个不同的单例,但是重复的编写创建单例的代码就会显得比较麻烦。如果我们将创建单例的代码以宏的形式定义出来,只需要简单的两句就能实现单例的声明和实现,就可以很容易的避免上面的麻烦.下面讲一下怎么实现宏定义单例.

    步骤一

    我们先创建一个头文件,将下面的代码声明到这个头文件中:

    //声明单例实现入口
    #define Singleton_InterFace(singletonName) \
    + (id)shared##singletonName;
    
    //创建单例实现方法
    #define Singleton_Implemention(singletonName) \
    static  id _singletonInstance = nil; \
    + (id)shared##singletonName \
    { \
        return  [[self alloc] init]; \
    } \
    + (id)allocWithZone:(NSZone *)zone \
    { \
        static dispatch_once_t onceToken; \
        dispatch_once(&onceToken, ^{ \
         _singletonInstance = [super allocWithZone:zone]; \
        }); \
       return _singletonInstance; \
    } \
    - (id)copyWithZone:(NSZone *)zone { \
        return _singletonInstance; \
    } \
    - (id)mutableCopyWithZone:(NSZone *)zone \
    { \
      return self; \
    } \
    
    步骤二

    按照步骤一将单例的实现方法以宏的方式定义出来,下面就调用声明好的宏方法:

    1.在.h中调用Singleton_InterFace(DataBaseManager);
    
    #import <Foundation/Foundation.h>
    #import "xxx.h"//定义宏单例的头文件
    @interface HYDataBaseManager : NSObject<NSCopying, NSMutableCopying>
    Singleton_InterFace(DataBaseManager);
    @end
    
    2.在.m中调用Singleton_Implemention(DataBaseManager);
    #import "HYDataBaseManager.h"
    @implementation HYDataBaseManager
    Singleton_Implemention(DataBaseManager);
    @end
    
    步骤三

    上面两步以及完成后,接下来我们就来验证一下单例是否正的能创建成功:

    //调用下面的方法
    - (void)singletonTest {
        HYDataBaseManager *dataBaseManager1 = [HYDataBaseManager shareDataBaseManager];
        HYDataBaseManager *dataBaseManager2 = [HYDataBaseManager shareDataBaseManager];
        NSLog(@"Manager1 == %@", dataBaseManager1);
        NSLog(@"Manager2 == %@", dataBaseManager2);
    }
    打印输出:
    2017-11-28 10:49:39.070465+0800 GCD[1670:75187] Manager1 == <HYDataBaseManager: 0x604000017790>
    2017-11-28 10:49:39.070701+0800 GCD[1670:75187] Manager2 == <HYDataBaseManager: 0x604000017790>
    
    从控制台的输出可以看出Manager1和Manager2是同一个对象,所以单例创建成功.
    

    引申: 系统提供的单例设计模式大都是以shared开头,那么我们的写法应该遵循系统的这种命名规范,##就是一个连接符,会将singletonName变量的值拼接在shared后面形成一个方法名,每行末尾的"\"也是C语音的一个连接符.注意,每行之间不能用空行,否则编译的时候会报错,若果需要空行,需要在空行处添加"\"。

    相关文章

      网友评论

          本文标题:Objective-C 宏定义单例

          本文链接:https://www.haomeiwen.com/subject/owesbxtx.html