概念
在整個項目中只有一份內(nèi)存干签,并不會分配很多內(nèi)存哟玷,這個類的對象只能被初始化一次
單例的使用
方式一:不考慮線程
示例:
+ (instancetype)shareInstance {
static LYUserManager *userManager;
if(!userManager){
userManager = [[LYUserManager alloc] init];
return userManager;
}
}
方式二:考慮線程
- 聲明一個靜態(tài)變量去保存類的實例,確保它在類中的全局可用性
- 聲明一個靜態(tài)變量dispatch_once_t,它確保初始化代碼只執(zhí)行一次
示例:
+ (instancetype)shareInstance {
static LYUserManager *userManager;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
userManager = [[LYUserManager alloc] init];
});
return userManager;
}
單例的優(yōu)化并設(shè)置斷言
通過上面的方法粹胯,我們已經(jīng)可以使用類方法來得到這個單例下隧,但是如果是多人開發(fā)此項目,為了安全與管理代碼的方便攻走,也為了給不是這個單例的創(chuàng)作者但會用到這個單例的開發(fā)人員一些提示殷勘,讓任何視圖通過alloc創(chuàng)建對象的程序段斷在此處,給程序員提示.我們通常會重寫一些方法:
示例:
+ (instancetype)alloc{
NSAssert(0, @"這是一個單例對象昔搂,請使用+(LYUserManager *)shareInstance方法");
return nil;
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
return [self shareInstance];
}
+ (instancetype)new{
return [self shareInstance];
}