單例模式,模式
在一個iOS應用的生命週期中,有時候我們只需要某個類的一個執行個體。例如當程式啟動時,應用的狀態由UIApplication類的一個執行個體維護,這個執行個體代表了整個應用程式物件,它只能是一個執行個體,作用是實現應用程式中一些共用資源的訪問和狀態的保持。
下面就是一個單例類的例子
#import "DDZPerson.h"@interface DDZPerson ()<NSCopying>@end@implementation DDZPersonstatic 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
在後面敲 \ 的原因是因為,宏定義只識別最近的一行
只有敲了 \ 之後才會繼續識別