單例
單:惟一性。例:實例對象。就是使用某個類建立的對象是程序中惟一的實例對象。(一般每次使用alloc建立的是不一樣的對象)web
若是一個類只能建立一個對象,稱爲單例類,能夠工具類,視圖類,控制器類設計模式
特色:全局均可以被訪問到,操做單例對象的變量不會被釋放,每次獲取的對象都是同一個對象,只建立一次多線程
建立:建立單例對象的方法,通常都爲類方法,命名規則爲share+類名 或者 standard+類名工具
注意: (1)操做單例對象的變量存儲在靜態區,程序關閉後由系統自動回收 (2)單例對象存儲在堆區,不釋放,程序關閉後由系統自動回收 (3)變量與單例對象的生命週期與程序同步性能
優點: (1)在內存中只有一個對象,節省內存空間 (2)避免頻繁的建立銷燬對象,能夠提升性能 (3)避免對共享資源的多重佔用 (4)能夠全局訪問 (5)下降模塊之間的藕合度,下降代碼的複雜度spa
僞單例與完整單例
根據須要咱們實現的單例有僞單例和完整單例兩種:線程
僞單例:只有經過該方法獲取到的纔是同一對象,通常狀況下咱們本身的單例類多采用僞單例的建立方式,不須要實現完整的單例設計
@implementation DataHandle
static DataHandle *handle = nil; +(DataHandle *)shareInstance { //@synchronized爲同步鎖,在該大括號的代碼段在多線程的時候受保護,一次只可以有一個線程執行,當多個線程訪問改單例的時候,後面的等待!!! @synchronized(self){ if(nil == handle)//判斷以前是否開闢了空間 { //當建立完整的單例,要避免死循環的問題 handle = [[DataHandle alloc]init]; } } return handle; }
完整單例:不只經過特定方法獲取到的是同一對象,進行alloc copy mutlcopy獲取到的也是同一個對象,就須要咱們重寫這些方法作一些內部實現code
例如:SingleTon爲單例名對象
static SingleTon *singleTon = nil;
+(SingleTon *)shareSingleTon { @sychronized{ if(singleTon == nil) { singleTon = [super allocWithZone:nil]init]; } } } + (instancetype)alloc { return [SingleTon shareSingTon]; } +(instancetype)allocWithZone:(struct _NSZone *)zone { return [SingleTon shareSingTon]; } -(id)copy { return [SingleTon shareSingTon]; } -(id)mutableCopy { return [SingleTon shareSingTon]; } -(oneway void)release { // 返回值爲空,不作任何操做 } -(NSUInteger)retainCount { // 返回整形最大數 return NSUIntegerMax; }