顧名思義,單例,便是在整個項目中,這個類的對象只能被初始化一次。它的這種特性,能夠普遍應用於某些須要全局共享的資源中,好比管理類,引擎類,也能夠經過單例來實現傳值。UIApplication、NSUserDefaults等都是IOS中的系統單例。程序員
單例的寫法經常使用的有兩種方式:設計模式
static SingleCase *manager = nil; + (SingleCase *)defaultManager { if (!manager){ SingleCase = [[self alloc] init]; return manager; } }
+ (SingleCase *)sharedManager { static SingleCase *ManagerInstance = nil; static dispatch_once_t predicate; dispatch_once(&predicate, ^{ ManagerInstance = [[self alloc] init]; }); return ManagerInstance; }
經過上面的方法,咱們已經可使用類方法來獲得這個單例,但不少時候,項目的工程量很大,還有可能會不少開發者同時參與一個項目的開發,爲了安全與管理代碼的方便,也爲了給不是這個單例的創做者但會用到這個單例的開發人員一些提示,咱們一般會重寫一些方法:安全
首先咱們本身實現一個alloc方法:優化
+(instancetype)myAlloc{ return [super allocWithZone:nil]; }
將咱們的單例實現方法略做修改:spa
+(ZYHPayManager *)sharedMamager{ static ZYHPayManager * manager; if (manager==nil) { manager=[[ZYHPayManager myAlloc]init]; } return manager; }
將一些視圖實例化對象的方法重寫:線程
+(instancetype)alloc{ NSAssert(0, @"這是一個單例對象,請使用+(ZYHPayManager *)sharedMamager方法"); return nil; } +(instancetype)allocWithZone:(struct _NSZone *)zone{ return [self alloc]; } -(id)copy{ NSLog(@"這是一個單例對象,copy將不起任何做用"); return self; } +(instancetype)new{ return [self alloc]; }
注意:這裏的alloc使用了斷言,讓任何視圖經過alloc建立對象的程序段斷在此處,給程序員提示。copy方法這裏只是簡單的返回了原對象,並未作任何處理,打印信息給程序員提示。設計
專一技術,熱愛生活,交流技術,也作朋友。code
——琿少 QQ羣:203317592對象