關(guān)于@weakify和@strongify的幾點問題及個人理解

這兩個宏相信大家一定都不陌生,也知道該如何使用。
本篇文章主要講到下面幾點問題,如果你都知道那么恭喜你,可以不用看這篇文章了。

1、為什么前面有個@號?

2、為什么一定要配對使用,為什么block里面不寫strongify還是會造成循環(huán)引用?

3、最簡單寫法?

答案在此:

1、為什么前面有個@號?

答:純粹為了裝逼,這個@號實際上是一個@autoreleasePool{},宏命令中只寫了autoreleasePool{},所以@符號需要外部傳入;

2、為什么一定要配對使用,block里面不寫strongify為什么還是會循環(huán)引用?
答:以 @weakify(self) 為例,首先,@weakify(self)最終實際上是生成了一個對self弱引用的變量 self_weak_;其次,@strongify(self)最終實際上是生成了一個對self_weak_強引用的變量 self,是的你沒有看錯,變量名稱就叫self,這就是為什么我們block里面的self不用改名字也不會造成循環(huán)引用的原因,因為你寫的self和外面的self已經(jīng)不一樣了(self:我們不一樣..不一樣...)!

明白了以上兩點,那么這個問題就很好理解了,其實就是一個“創(chuàng)建weak-替換self”的過程,所以必須配對使用。

讓我們來實踐一下,如果只寫@weakify(self),編譯器會報黃色警告 unused variable 'self_weak_'。

@weakify(self)
// Warning: Unused variable 'self_weak_'

反之如果只寫@strongify(self),編譯器則會報紅色錯誤 undefined identifier 'self_weak_'。

@strongify(self)
// Error: Used undefined identifer 'self_weak_'

其次,在@strongify(self)宏之前寫的self,代碼提示會告訴你self是當(dāng)前類,而在@strongify(self)宏之后寫的self,代碼提示會告訴你這個self是個typeof(self),也驗證了此self非彼self,self已經(jīng)被替換掉 (self: 我們不一樣..不一樣...) !

@weakify(self)
void(^block)() = ^{
//self is a const objct indentifier associated to your current class.
strongify(self)
//self is a 'typeof (self)' variable.
}

所以block里面不寫strongify的話self沒有被替換掉,所以當(dāng)然會導(dǎo)致循環(huán)引用咯!

3、最簡單寫法?

__weak typeof(self) wself = self;
void(^block)(void) = ^{
__strong typeof(wself) self = wself;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容