在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方法中加上斷言來提醒。