單例模式通常有兩種:懶漢式和餓漢式
區別:
懶漢式:
第一次用到單例對象時 再創建單例對象。
餓漢式:
餓漢式:一進入程序就創建。
在iOS開發中爲了節約資源因此推薦使用懶漢式。
iOS中懶漢式使用的一般過程:
1、頭文件中自定義一個shareInstance類方法用來返回單例對象
2、實現文件中重寫allocwithzero方法,返回要執行單例的對象(對象爲全局的static對象)
3、在allwithzero的方法中判斷單例對象是否爲nil,爲nil則執行
4、在執行方法中使用同步鎖(鎖對象爲self)
5、在同步鎖中判斷是否爲空(防止多線程創建)
6、判斷爲空則通過super的allockwithzone新建一個對象
7、若要使用copy,則遵守nscoping,並且在copy方法中返回單例對象
8、單例對象的獲取通過我們自己定義的shareInstance方法獲取,同樣在shareInstance方法中執行兩次非空判斷,第二次非空判斷要加鎖,並且在第二次判斷中通過alloc init創建對象(其實就是調用allocwithzone)
代碼:
.h文件
+(instancetype)sharedInstance;
.m文件
static id _instance;
+(instancetype)sharedInstance
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[self alloc]init];
});
return _instance;
}
+(instancetype)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
return _instance;
}
-(id)copyWithZone:(NSZone *)zone
{
return _instance;
}
- (oneway void)release{ }
- (id)retain { returnself; }
- (NSUInteger)retainCount { return1;}
- (id)autorelease { returnself;}