單例
單例模式,其實是非常常見的一種模式,簡單來說就是保證整個生命周期內(nèi),該對象只有一份拷貝,所以兩點保證,首先保證在生命周期內(nèi)該對象不被銷毀,所以需要static修飾一下,將對象保存在靜態(tài)數(shù)據(jù)區(qū),同時保證該對象只會被初始化一次,這里有兩個思考,synchronized鎖或者GCD提供的dispatch_once。實現(xiàn)上面兩步就完成了一個偽單例,真正的單例還需要保證,不管是copy,mutableCopy,copyWithZone都需要返回同一個對象,重寫這些方法直接返回self,同時引用計數(shù)也沒有意思,可以重寫alloc,retain,release,autoRelease,以及retainCount的set方法。
下面提供偽單例的兩種寫法實現(xiàn):
//synchronized鎖
+ (Obj *)sharedInstance {
static Obj *sharedInstance = nil; //注意static修飾
//再加鎖前首先判斷,對象是否創(chuàng)建,防止每次進來都加鎖造成資源浪費
if (!sharedInstance) {
@synchronized
//加鎖后再判斷一次對象是否存在,是保證只初始化一次
if (!sharedInstance){
sharedInstance = [[Obj alloc] init];
}
}
return sharedInstance;
}
//dispatch_once實現(xiàn)
+ (Obj *)sharedInstance {
static Obj *sharedInstance = nil;//static修飾
static dispatch_once_t onceToken; //將該token也保存到靜態(tài)區(qū),保證dispatch_once只執(zhí)行一次
dispatch_once(&onceToken, ^{
sharedInstance = [[Obj alloc] init];
});
return sharedInstance;
}
以上就是偽單例的兩種實現(xiàn)方式,但是注意單例模式不可濫用,會影響編譯速度等。
覺得有用,請幫忙點亮紅心
Better Late Than Never!
努力是為了當(dāng)機會來臨時不會錯失機會。
共勉!