1、單例的感化
望文生義,單例,等於在全部項目中,這個類的對象只能被初始化一次。它的這類特征,可以普遍運用於某些須要全局同享的資本中,好比治理類,引擎類,也能夠經由過程單例來完成傳值。UIApplication、NSUserDefaults等都是IOS中的體系單例。
2、單例形式的兩種寫法
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函數只履行一次。
3、代碼的優化
經由過程下面的辦法,我們曾經可使用類辦法來獲得這個單例,但許多時刻,項目標工程量很年夜,還有能夠會許多開辟者同時介入一個項目標開辟,為了平安與治理代碼的便利,也為了給不是這個單例的創作者但會用到這個單例的開辟人員一些提醒,我們平日會重寫一些辦法:
起首我們本身完成一個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辦法這裡只是簡略的前往了原對象,並未做任何處置,打印信息給法式員提醒。
【iOS App開辟中應用設計形式中的單例形式的實例解析】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!