iOS 【单例模式 宏实现①/.pch文件创建使用(掌握)】

单例模式每次都写这么长串代码肯定会觉得乏味,如果有很多个类都要弄成单例模式,就会写很多重复的代码了。就算是copy,那也是很费事的。那么我们可不可以用宏的方式去代替一大段一大段的代码呢?显然这是可以做到的。


在用宏去完成单例模式之前,给大家引入一个概念,那就是 precompiled header(预编译头文件)。

预编译头文件(一般扩展名为.PCH),是把一个工程中较稳定的代码预先编译好放在一个文件(.PCH)里。这些预先编译好的代码可以是任何的C/C++代码,甚至可以是inline函数,只它们在整个工程中是较为稳定的,即在工程开发过程中不会经常被修改的代码。

上面的一段话重点在于这些放在预编译头文件中的代码都是比较稳定的代码,在工程开发过程中不会被经常修改而是直接拿来用。


解释完.pch文件,那么我们就来一步一步的将单例模式的代码转化为宏来使用。


(1)首先,我们先创建一个用来存放单例模式代码的头文件 Singleton.h (只创建头文件就可以)

iOS 【单例模式 宏实现①/.pch文件创建使用(掌握)】_第1张图片


(2)在 Singleton.h 中加入如下代码:

// 单例模式 宏实现

// .h 文件
#define SingletonH + (instancetype)shareInstance;

// .m 文件(由于宏只对后面紧跟的代码有作用,所以为了让 SingletonM 去替代下面这一堆代码,我们需要加斜线 '\',斜线的作用是替代下一行)
#define SingletonM \
static id _instance; \
 \
+ (instancetype)shareInstance \
{ \
    static dispatch_once_t onceToken; \
    dispatch_once(&onceToken, ^{ \
        _instance = [[self alloc] init]; \
    }); \
    return _instance; \
} \
 \
+ (instancetype)allocWithZone:(struct _NSZone *)zone \
{ \
    static dispatch_once_t onceToken; \
    dispatch_once(&onceToken, ^{ \
        _instance = [super allocWithZone:zone]; \
    }); \
    return _instance; \
} \
 \
- (id)copyWithZone:(NSZone *)zone \
{ \
    return _instance; \
} 
// 斜线一直写到倒数第二行,最后一行不用写,因为最后一行的下一行我们不需要。

(3)创建一个.pch 文件(在 Xcode 6.0 之前是自动创建的,为了提高编译速度而取消了,现在我们需要自己创建了)

iOS 【单例模式 宏实现①/.pch文件创建使用(掌握)】_第2张图片


(4)设置引用你所创建的.pch文件路径

代码如下:

$(SRCROOT)/pchFile.pch

这里需要注意,加上代码的时候要准确的看好路径,上面的代码显然是不全的,需要添加上你的准确路径。

iOS 【单例模式 宏实现①/.pch文件创建使用(掌握)】_第3张图片

所以这句代码应该写成:

$(SRCROOT)/44-单例模式(宏 实现)/PCHFile.pch

中间补上的就是你的项目名称。

如果不加项目名称,那么可能会出现这样的错误

/Users/wangzhongyao/Desktop/for learning/Pages for iOS/代码/44-单例模式(宏 实现)/<command line>:3:10: '/Users/wangzhongyao/Desktop/for learning/Pages for iOS/代码/44-单例模式(宏 实现)/PCHFile.pch' file not found


(5)在预编译头文件中导入宏的头文件

iOS 【单例模式 宏实现①/.pch文件创建使用(掌握)】_第4张图片

这样一来,我们的宏就可以在整个项目中使用了。


(6)最后用我们的宏去取代之前繁琐的代码就ok了


iOS 【单例模式 宏实现①/.pch文件创建使用(掌握)】_第5张图片

你可能感兴趣的:(ios,单例模式,预编译头文件,宏实现,如何添加.pch文件)