導(dǎo)讀
iOS weak 關(guān)鍵字漫談
Objective C & iOS Weak Singletons
從以上導(dǎo)讀中我見(jiàn)識(shí)到了weak的新用法或者說(shuō)新的應(yīng)用場(chǎng)景:?jiǎn)卫?/p>
我們之前的做法都是用一個(gè)static來(lái)修飾的強(qiáng)指針來(lái)持有這個(gè)單例惹资,那這樣的話這個(gè)單例就會(huì)跟隨程序的生命周期知道進(jìn)程殺死席吴。那有時(shí)候這個(gè)單例可能依托于某一個(gè)視圖控制器或者某一個(gè)功能模塊涎跨,只要這個(gè)視圖控制器或者功能模塊銷毀了那這個(gè)單例對(duì)象也就毫無(wú)意義了,那這個(gè)時(shí)候如果采用全局單例就會(huì)有內(nèi)存浪費(fèi)回溺,所以有了今天的Weak Singleton。
那么從導(dǎo)讀上的文章我說(shuō)一下步驟代碼:
代碼如下
1、構(gòu)建單例
//采用鎖的方式構(gòu)建
+ (instancetype)sharedInstance
{
//static修飾的是弱引用指針
static __weak ASingletonClass *instance;
ASingletonClass *strongInstance = instance;
@synchronized(self) {
if (strongInstance == nil) {
strongInstance = [[[self class] alloc] init];
instance = strongInstance;
}
}
return strongInstance;
}
//采用鎖的方式構(gòu)建
+ (instancetype)sharedInstance
{
//static修飾的是弱引用指針
static __weak ASingletonClass *instance;
ASingletonClass *strongInstance = instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (strongInstance == nil) {
strongInstance = [[[self class] alloc] init];
instance = strongInstance;
});
return strongInstance;
}
2累贤、作為某一個(gè)類的實(shí)例變量或者屬性也是可以的,但是屬性得是強(qiáng)引用
//實(shí)例變量
{
ASingletonClass *_singletonInstance;
}
//屬性
@property (nonatomic, strong) ASingletonClass * singletonInstance;
3少漆、創(chuàng)建這個(gè)單例對(duì)象臼膏,并賦值給實(shí)例變量
_singletonInstance = [ASingletonClass sharedInstance];
PS: 其中ASingletonClass指的是單例類
但是呢這個(gè)單例類必須得被別的類強(qiáng)引用要不然創(chuàng)建之后就會(huì)釋放,其實(shí)和之前的普通的本類全局的強(qiáng)引用是一樣的示损,只不過(guò)起到了在本類沒(méi)釋放掉之前都是同一個(gè)對(duì)象的效果渗磅。
以上!J合薄夺溢!