(1)單例模式
在程序運行過程禽翼,一個類只有一個實例
(2)使用場合
在整個應用程序中属瓣,共享一份資源(這份資源只需要創(chuàng)建初始化1次)
1.2 ARC實現(xiàn)單例
(1)步驟
01 在類的內(nèi)部提供一個static修飾的全局變量
02 提供一個類方法,方便外界訪問
03 重寫+allocWithZone方法鉴裹,保證永遠都只為單例對象分配一次內(nèi)存空間
04 嚴謹起見缔御,重寫-copyWithZone方法和-MutableCopyWithZone方法
(2)相關(guān)代碼
提供一個static修飾的全局變量蚜枢,強引用著已經(jīng)實例化的單例對象實例
static XMGTools *_instance;
類方法,返回一個單例對象
+(instancetype)shareTools
{
注意:這里建議使用self,而不是直接使用類名Tools(考慮繼承)
return [[self alloc]init];
}
保證永遠只分配一次存儲空間
+(instancetype)allocWithZone:(struct _NSZone *)zone
{
//使用GCD中的一次性代碼
//? ? static dispatch_once_t onceToken;
//? ? dispatch_once(&onceToken, ^{
//? ? ? ? _instance = [super allocWithZone:zone];
//? ? });
//使用加鎖的方式壶运,保證只分配一次存儲空間
@synchronized(self) {
if (_instance == nil) {
_instance = [super allocWithZone:zone];
}
}
return _instance;
}
1. mutableCopy 創(chuàng)建一個新的可變對象耐齐,并初始化為原對象的值,新對象的引用計數(shù)為 1蒋情;
2. copy 返回一個不可變對象埠况。分兩種情況:(1)若原對象是不可變對象,那么返回原對象棵癣,并將其引用計數(shù)加 1 辕翰;(2)若原對象是可變對象,那么創(chuàng)建一個新的不可變對象狈谊,并初始化為原對象的值喜命,新對象的引用計數(shù)為 1沟沙。
//讓代碼更加的嚴謹
-(nonnull id)copyWithZone:(nullable NSZone *)zone
{
//? ? return [[self class] allocWithZone:zone];
return _instance;
}
-(nonnull id)mutableCopyWithZone:(nullable NSZone *)zone
{
return _instance;
}
1.3 MRC實現(xiàn)單例
(1)實現(xiàn)步驟
01 在類的內(nèi)部提供一個static修飾的全局變量
02 提供一個類方法,方便外界訪問
03 重寫+allocWithZone方法壁榕,保證永遠都只為單例對象分配一次內(nèi)存空間
04 嚴謹起見矛紫,重寫-copyWithZone方法和-MutableCopyWithZone方法
05 重寫release方法
06 重寫retain方法
07 建議在retainCount方法中返回一個最大值
(2)配置MRC環(huán)境知識
01 注意ARC不是垃圾回收機制,是編譯器特性
02 配置MRC環(huán)境:build setting ->搜索automatic ref->修改為NO
(3)相關(guān)代碼
//提供一個static修飾的全局變量牌里,強引用著已經(jīng)實例化的單例對象實例
static XMGTools *_instance;
//類方法颊咬,返回一個單例對象
+(instancetype)shareTools
{
//注意:這里建議使用self,而不是直接使用類名Tools(考慮繼承)
return [[self alloc]init];
}
//保證永遠只分配一次存儲空間
+(instancetype)allocWithZone:(struct _NSZone *)zone
{
//使用GCD中的一次性代碼
//? ? static dispatch_once_t onceToken;
//? ? dispatch_once(&onceToken, ^{
//? ? ? ? _instance = [super allocWithZone:zone];
//? ? });
//使用加鎖的方式,保證只分配一次存儲空間
@synchronized(self) {
if (_instance == nil) {
_instance = [super allocWithZone:zone];
}
}
return _instance;
}
//讓代碼更加的嚴謹
-(nonnull id)copyWithZone:(nullable NSZone *)zone
{
//? ? return [[self class] allocWithZone:zone];
return _instance;
}
-(nonnull id)mutableCopyWithZone:(nullable NSZone *)zone
{
return _instance;
}
//在MRC環(huán)境下牡辽,如果用戶retain了一次贪染,那么直接返回instance變量,不對引用計數(shù)器+1
//如果用戶release了一次催享,那么什么都不做,因為單例模式在整個程序運行過程中都擁有且只有一份哟绊,程序退出之后被釋放因妙,所以不需要對引用計數(shù)器操作
-(oneway void)release
{
}
-(instancetype)retain
{
return _instance;
}
//慣用法,有經(jīng)驗的程序員通過打印retainCount這個值可以猜到這是一個單例
-(NSUInteger)retainCount
{
return MAXFLOAT;
}