????單例是在我們在項目學(xué)習(xí)特別是在工具類的抽取中經(jīng)常用到的一種設(shè)計模式。說道底,單例就是一個類唯一的實例對象,我們無法通過alloc等其他方法來開辟一塊新的內(nèi)存,創(chuàng)建這個類的第二個實例對象。從而達到易于外界訪問,節(jié)約系統(tǒng)資源的目的。
????那么現(xiàn)在我們就模仿系統(tǒng)手動創(chuàng)建一個單例,首先聲明一個靜態(tài)的實例對象:
static Person *_per;
????程序啟動立即創(chuàng)建實例對象
//當(dāng)類被加載到內(nèi)存當(dāng)中時,就會調(diào)用load.
+(void)load {
//1.程序一啟動,就創(chuàng)建一個對象
Person *per = [[self alloc] init];
//類方法是不能訪問當(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)的默認做法
return [super alloc];
}
創(chuàng)建快速sharePerson方法,保證只有一個內(nèi)存
+ (Person *)sharePerson {
return _per;
}
重寫系統(tǒng)的其他構(gòu)造方法
- (id)copyWithZone:(struct _NSZone *)zone
{
return _instance;
}
- (id)mutableCopyWithZone:(NSZone *)zone
{
return _instance;
}