????單例是在我們?cè)陧?xiàng)目學(xué)習(xí)特別是在工具類的抽取中經(jīng)常用到的一種設(shè)計(jì)模式耘子。說(shuō)道底液南,單例就是一個(gè)類唯一的實(shí)例對(duì)象踩麦,我們無(wú)法通過(guò)alloc等其他方法來(lái)開辟一塊新的內(nèi)存枚赡,創(chuàng)建這個(gè)類的第二個(gè)實(shí)例對(duì)象。從而達(dá)到易于外界訪問(wèn)谓谦,節(jié)約系統(tǒng)資源的目的贫橙。
????那么現(xiàn)在我們就模仿系統(tǒng)手動(dòng)創(chuàng)建一個(gè)單例,首先聲明一個(gè)靜態(tài)的實(shí)例對(duì)象:
static Person *_per;
????程序啟動(dòng)立即創(chuàng)建實(shí)例對(duì)象
//當(dāng)類被加載到內(nèi)存當(dāng)中時(shí),就會(huì)調(diào)用load.
+(void)load {
//1.程序一啟動(dòng),就創(chuàng)建一個(gè)對(duì)象
Person *per = [[self alloc] init];
//類方法是不能訪問(wèn)當(dāng)前類的成員屬性.
//self.per = per;
_per = per;
}
????重寫系統(tǒng)的allocWithZone:方法
// 重寫allocWithZone方法,
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
if (_per) {
NSException *exc = [NSException exceptionWithName:@"NSInternalInconsistencyException" reason:@"There can only be one Person instance." userInfo:nil];
//拋出異常
[exc raise];
}
//保持系統(tǒng)的默認(rèn)做法
return [super alloc];
}
創(chuàng)建快速sharePerson方法,保證只有一個(gè)內(nèi)存
+ (Person *)sharePerson {
return _per;
}
重寫系統(tǒng)的其他構(gòu)造方法
- (id)copyWithZone:(struct _NSZone *)zone
{
return _instance;
}
- (id)mutableCopyWithZone:(NSZone *)zone
{
return _instance;
}