在iOS開發中單例用的非常普遍,比如說通知中心,NSUserDefauld等都都是單例模式,原來以為創建一個單例是很簡單的事情。直接用GCD來搞定。
<code>+ (instancetype)shared
{
static dispatch_once_t once = 0;
static Class *singleton;
dispatch_once(&once, ^{
alert = [[Class alloc] init];
});
return singleton;
}</code>
這樣就搞定了,今天忽然被問到怎麼避免通過自帶的alloc來進行實例化,這樣就不能保證單例了。
那麼只要把alloc都禁止使用就可以了,所以我們需要重載系統提供的各種alloc方法來避免這種情況。
我們來稍微改造一下
<code>+ (instancetype)hiddenAlloc
{
return [super alloc];
}
+ (instancetype)alloc
{
NSAssert(NO, @"請使用shared方法");
return nil;
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
return [self alloc];
}
+ (instancetype)new
{
return [self alloc];
}
+ (instancetype)shared
{
static dispatch_once_t once = 0;
static HHAlertView *alert;
dispatch_once(&once, ^{
alert = [[HHAlertView hiddenAlloc] init];
});
return alert;
}</code>
以上重載了alloc、allocWithZone和new方法,讓其不能調用父類的alloc方法,然後創建我們的私有alloc方法,在alloc方法中加上斷言來提醒。