一般情況我們都是這么寫:
static MySingleton *shareSingleton;
+( instancetype ) sharedSingleton? {
static? dispatch_once? onceToken;
dispatch_once ( &onceToken, ^ {
shareSingleton = [ [ MySingleton alloc ] init ] ;
} );
return?sharedSingleton;
}
但是調用shareInstance方法時獲取到的對象是相同的,但是當我們通過alloc和init來構造對象的時候,有時候得到的對象卻是不一樣的北苟。創(chuàng)建對象的步驟分為申請內存(alloc)、初始化(init)這兩個步驟远舅,我們要確保對象的唯一性递宅,因此在第一步這個階段我們就要攔截它。當我們調用alloc方法時盈包,oc內部會調用allocWithZone這個方法來申請內存代乃,我們覆寫這個方法旬牲,然后在這個方法中調用shareInstance方法返回單例對象,這樣就可以達到我們的目的搁吓≡拷貝對象也是同樣的原理,覆寫copyWithZone方法擎浴,然后在這個方法中調用shareInstance方法返回單例對象员咽。所以建議以后安全一點都這么寫:
static? MySingleton? *shareSingleton = nil;
+( instancetype ) sharedSingleton? {
static? dispatch_once? onceToken;
dispatch_once ( &onceToken, ^ {
shareSingleton? =? [[super allocWithZone:NULL] init] ;
} );
return?sharedSingleton;
}
+(id) allocWithZone:(struct _NSZone *)zone {
return [Singleton shareInstance] ;
}
-(id) copyWithZone:(struct _NSZone *)zone {
return [Singleton shareInstance] ;
}