這次項(xiàng)目中遇到了一個單例創(chuàng)建不嚴(yán)格造成了的問題灭红。簡單說來就是在有的地方使用了alloc創(chuàng)建了多個實(shí)例,當(dāng)然如果嚴(yán)格按照接口的方法調(diào)用是不會有問題的械拍,但是如果項(xiàng)目碰到有不太熟悉的人使用時(shí)在處理時(shí)就會出現(xiàn)使用其它的方法來創(chuàng)建實(shí)例傍妒,比如說用alloc,這樣本打算使用相同的一個實(shí)例成了多個而達(dá)不到做這個模式的目的拒迅。
關(guān)于單例模式的實(shí)現(xiàn)主要是static調(diào)用后存儲空間不釋放的特性使得實(shí)例在程序的生命周期中保持唯一,根據(jù)這個特點(diǎn)她倘,如果要解決前面的問題璧微,可以在allocWithZone里調(diào)用接口sharInstance方法,在copyWithZone里直接返回實(shí)例硬梁,具體實(shí)現(xiàn)如下:
@implementation XNShareTool
/**
步驟:
1.一個靜態(tài)變量_inastance
2.重寫allocWithZone, 在里面用dispatch_once, 并調(diào)用super allocWithZone
3.自定義一個sharedXX, 用來獲取單例. 在里面也調(diào)用dispatch_once, 實(shí)例化_instance
-----------可選------------
4.如果要支持copy. 則(先遵守NSCopying協(xié)議)重寫copyWithZone, 直接返回_instance即可.
*/
/**第1步: 存儲唯一實(shí)例*/
static XNShareTool *_instance;
/**第2步: 分配內(nèi)存孔家時(shí)都會調(diào)用這個方法. 保證分配內(nèi)存alloc時(shí)都相同*/
+(id)allocWithZone:(struct _NSZone *)zone{
//調(diào)用dispatch_once保證在多線程中也只被實(shí)例化一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
return _instance;
}
/**第3步: 保證init初始化時(shí)都相同*/
+(instancetype)sharedTool{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[XNShareTool alloc] init];
});
return _instance;
}
/**第4步: 保證copy時(shí)都相同*/
-(id)copyWithZone:(NSZone *)zone{
return _instance;
}
@end