Objective-C 宏定義單例

單例設(shè)計(jì)模式是開發(fā)中經(jīng)常會(huì)被用到的一種設(shè)計(jì)模式,而且有時(shí)候一個(gè)項(xiàng)目中會(huì)用到多個(gè)不同的單例,但是重復(fù)的編寫創(chuàng)建單例的代碼就會(huì)顯得比較麻煩。如果我們將創(chuàng)建單例的代碼以宏的形式定義出來(lái),只需要簡(jiǎn)單的兩句就能實(shí)現(xiàn)單例的聲明和實(shí)現(xiàn),就可以很容易的避免上面的麻煩.下面講一下怎么實(shí)現(xiàn)宏定義單例.

步驟一

我們先創(chuàng)建一個(gè)頭文件,將下面的代碼聲明到這個(gè)頭文件中:

//聲明單例實(shí)現(xiàn)入口
#define Singleton_InterFace(singletonName) \
+ (id)shared##singletonName;

//創(chuàng)建單例實(shí)現(xiàn)方法
#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; \
} \
步驟二

按照步驟一將單例的實(shí)現(xiàn)方法以宏的方式定義出來(lái),下面就調(diào)用聲明好的宏方法:

1.在.h中調(diào)用Singleton_InterFace(DataBaseManager);

#import <Foundation/Foundation.h>
#import "xxx.h"http://定義宏單例的頭文件
@interface HYDataBaseManager : NSObject<NSCopying, NSMutableCopying>
Singleton_InterFace(DataBaseManager);
@end

2.在.m中調(diào)用Singleton_Implemention(DataBaseManager);
#import "HYDataBaseManager.h"
@implementation HYDataBaseManager
Singleton_Implemention(DataBaseManager);
@end
步驟三

上面兩步以及完成后,接下來(lái)我們就來(lái)驗(yàn)證一下單例是否正的能創(chuàng)建成功:

//調(diào)用下面的方法
- (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>

從控制臺(tái)的輸出可以看出Manager1和Manager2是同一個(gè)對(duì)象,所以單例創(chuàng)建成功.

引申: 系統(tǒng)提供的單例設(shè)計(jì)模式大都是以shared開頭,那么我們的寫法應(yīng)該遵循系統(tǒng)的這種命名規(guī)范,##就是一個(gè)連接符,會(huì)將singletonName變量的值拼接在shared后面形成一個(gè)方法名,每行末尾的"\"也是C語(yǔ)音的一個(gè)連接符.注意,每行之間不能用空行,否則編譯的時(shí)候會(huì)報(bào)錯(cuò),若果需要空行,需要在空行處添加"\"。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容