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