一、單例的作用
顧名思義,單例,即是在整個項目中,這個類的對象只能被初始化一次。它的這種特性,可以廣泛應用於某些需要全局共享的資源中,比如管理類,引擎類,也可以通過單例來實現傳值。UIApplication、NSUserDefaults等都是IOS中的系統單例。
二、單例模式的兩種寫法
1,常用寫法
#import "LGManagerCenter.h" static LGManagerCenter *managerCenter; @implementation LGManagerCenter +(LGManagerCenter *)sharedManager{ if(!managerCenter) managerCenter=[[self allocWithZone:NULL] init]; return managerCenter; } @end
2,用GCD創建單例類
#import "LGManagerCenter.h" @implementation LGManagerCenter +(LGManagerCenter *)sharedManager{ static dispatch_once_t predicate; static LGManagerCenter * managerCenter; dispatch_once(&predicate, ^{ managerCenter=[[LGManagerCenter alloc] init]; }); return managerCenter; } @end
其中dispatch_once函數只執行一次。
三、代碼的優化
通過上面的方法,我們已經可以使用類方法來得到這個單例,但很多時候,項目的工程量很大,還有可能會很多開發者同時參與一個項目的開發,為了安全與管理代碼的方便,也為了給不是這個單例的創作者但會用到這個單例的開發人員一些提示,我們通常會重寫一些方法:
首先我們自己實現一個alloc方法:
+(instancetype)myAlloc{ return [super allocWithZone:nil]; }
將我們的單例實現方法略作修改:
+(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方法這裡只是簡單的返回了原對象,並未做任何處理,打印信息給程序員提示。