摘要
單例的設(shè)計思想非常巧妙抵屿,是面向?qū)ο笳Z言的一大優(yōu)勢聚唐,在需要全局資源共享的對象時丐重,經(jīng)常會用到這種設(shè)計模式。
IOS 中單例設(shè)計模式的解讀與用法
一杆查、單例的作用
顧名思義扮惦,單例,即是在整個項目中亲桦,這個類的對象只能被初始化一次崖蜜。它的這種特性,可以廣泛應(yīng)用于某些需要全局共享的資源中客峭,比如管理類豫领,引擎類,也可以通過單例來實現(xiàn)傳值桃笙。UIApplication氏堤、NSUserDefaults等都是IOS中的系統(tǒng)單例。
二、單例的寫法
單例的寫法常用的有兩種方式:
方式1鼠锈、不考慮線程
static SingleCase *manager = nil;
+ (SingleCase *)defaultManager {
if (!manager){
?SingleCase = [[self alloc] init];
?return manager;
}
}
方式2闪檬、考慮線程安全
+ (SingleCase *)sharedManager
{
static SingleCase *ManagerInstance = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
ManagerInstance = [[self alloc] init];
});
return ManagerInstance;
}
三、代碼的優(yōu)化
通過上面的方法购笆,我們已經(jīng)可以使用類方法來得到這個單例粗悯,但很多時候,項目的工程量很大同欠,還有可能會很多開發(fā)者同時參與一個項目的開發(fā)样傍,為了安全與管理代碼的方便,也為了給不是這個單例的創(chuàng)作者但會用到這個單例的開發(fā)人員一些提示铺遂,我們通常會重寫一些方法:
首先我們自己實現(xiàn)一個alloc方法:
+(instancetype)myAlloc{
? ?return [super allocWithZone:nil];
}
將我們的單例實現(xiàn)方法略作修改:
+(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創(chuàng)建對象的程序段斷在此處撤逢,給程序員提示。copy方法這里只是簡單的返回了原對象粮坞,并未做任何處理蚊荣,打印信息給程序員提示。