在一個iOS應用的生命周期中,有時候我們只需要某個類的一個實例。例如當程式啟動時,應用的狀態由UIApplication類的一個實例維護,這個實例代表了整個應用程式對象,它只能是一個實例,作用是實現應用程式中一些共用資源的訪問和狀態的保持。 下麵就是一個單例類的例子 因為基本上所有的類單例模式都差不 ...
在一個iOS應用的生命周期中,有時候我們只需要某個類的一個實例。例如當程式啟動時,應用的狀態由UIApplication類的一個實例維護,這個實例代表了整個應用程式對象,它只能是一個實例,作用是實現應用程式中一些共用資源的訪問和狀態的保持。
下麵就是一個單例類的例子
#import "DDZPerson.h" @interface DDZPerson ()<NSCopying> @end @implementation DDZPerson static DDZPerson *_person; //實現單例模式,先重寫allocWithZone + (instancetype)allocWithZone:(struct _NSZone *)zone { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ //只執行一次 _person = [super allocWithZone:zone]; }); return _person; } //為了方便用戶直接調用 + (instancetype)sharedPerson { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _person = [[self alloc] init]; }); return _person; } //實現可以copy的方法 - (id)copyWithZone:(NSZone *)zone { return _person; } @end
因為基本上所有的類單例模式都差不多
所以完全可以將他們定義在一個巨集文件中
#define DDZSingletonH + (instancetype)sharedInstance; #define DDZSingletonM \ static id *_instance;\ \ + (instancetype)allocWithZone:(struct _NSZone *)zone {\ static dispatch_once_t onceToken;\ dispatch_once(&onceToken, ^{\ \ _instance = [super allocWithZone:zone];\ \ });\ \ return _instance;\ }\ \ + (instancetype)sharedInstance {\ static dispatch_once_t onceToken;\ dispatch_once(&onceToken, ^{\ \ _instance = [[self alloc] init];\ \ });\ \ return _instance;\ }\ \ - (id)copyWithZone:(NSZone *)zone {\ return _instance;\ }View Code
在後面敲 \ 的原因是因為,巨集定義只識別最近的一行
只有敲了 \ 之後才會繼續識別
補充:如果你想要自定義方法名,可以這麼做
#define DDZSingletonH(name) + (instancetype)shared##name;
根據傳進來的name來定義方法名sharedname;