iOS開發(fā)技巧之WeakSelf宏的進化詳解
前言
本文主要給大家介紹了關于iOS之WeakSelf宏的進化的相關內(nèi)容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。
WeakSelf宏的進化
我們都知道在防止如block的循環(huán)引用時,會使用__weak關鍵字做如下定義:
__weak typeof(self) weakSelf = self;
后來,為了方便,不用每次都要寫這樣一句固定代碼,我們定義了宏:
#define WeakSelf __weak typeof(self) weakSelf = self;
之后,我們可以比較方便的在需要的地方:
WeakSelf; ... [weakSelf doSomething];
再后來,我們發(fā)現(xiàn)不止self需要使用weak,可能有部分變量也需要weak,于是我們的宏繼續(xù)進化,不僅僅只支持self:
#define WeakObj(o) __weak typeof(o) o##Weak = o;
這樣,后續(xù)對需要使用weak的對象,只要寫一句WeakObj(obj) 即可使用objWeak變量了(PS:發(fā)現(xiàn)沒有,這里生成的變量名其實是objWeak,并不是weakObj,原因見文章末的注1)
再后來,我們發(fā)現(xiàn)了一些小技巧,可以讓我們的這個宏看起來更原生一些,我們添加了@符號在前面:
#define WeakObj(o) autoreleasepool{} __weak typeof(o) o##Weak = o;
使用上看起來是這樣
@WeakObj(self); ... [selfWeak doSomething];
是不是感覺挺高大上的?
這里是利用了@autoreleasepool{}這個系統(tǒng)的關鍵字來實現(xiàn)的,其實還可以利用@try{}@finally{}這個也可以達到相同的效果,比如:
#define WeakObj(o) try{}@finally{} __weak typeof(o) o##Weak = o;
這部分空的@try或者空的@autoreleasepool會在編譯時被優(yōu)化掉,不必擔心性能問題。
至此,我們的宏已經(jīng)可以用了,但是實際使用中,出現(xiàn)了一個很尷尬的問題,就是代碼自動補全,@W并不能自動提示出該宏,所以每次都是很尷尬的先利用提示,寫完WeakObj(obj) ,然后光標移動到前面去打上一個@符號。
這種事情怎么能忍受?
還好我們還有利器,Xcode的CodeSnippet,任意方法內(nèi),寫一句代碼
@WeakObj(<#obj#>);
拖到Xcode的CodeSnippet區(qū)域,快捷鍵設置為@WeakObj即可。

至此,愉快的使用@W即可自動補全出該宏了。。
另外,還有相應的strong宏,一并曬在這里
#define StrongObj(o) autoreleasepool{} __strong typeof(o) o = o##Weak;
用處嘛簡單寫個例子:
@WeakObj(self);
[var setBlock:^{
@StrongObj(self);
[self doSomething];
}];
關于這么寫的原因,請先自行揣摩,之后可以看看曉月的這篇文章:http://www.dhdzp.com/article/140126.htm,也可以在評論中留言。
最后,揭曉為什么該宏生成的變量名是objWeak:
1. 使用時,如果開發(fā)者習慣性的要打出 [self doSomething]時,當他輸入self時,自動補全出來的部分能看到還有selfWeak可供選擇,算是一種提醒方式。
2. 如果weak前置,當然也可以,生成的會是weakobj這樣的變量名,只需要把宏中o##Weak 換成weak##o
好了,這篇文章希望對一些人有些啟發(fā)或幫助。
最后曬出個人在用的宏定義:
#define YRWeakObj(o) autoreleasepool{} __weak typeof(o) o##Weak = o;
#define YRStrongObj(o) autoreleasepool{} __strong typeof(o) o = o##Weak;
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
iOS應用開發(fā)中UITabBarController標簽欄控制器使用進階
這篇文章主要介紹了iOS應用開發(fā)中UITabBarController標簽欄控制器的使用進階,實例代碼為傳統(tǒng)的Objective-C,需要的朋友可以參考下2016-03-03
詳解iOS開發(fā)中使用storyboard創(chuàng)建導航控制器的方法
這篇文章主要介紹了iOS開發(fā)中使用storyboard創(chuàng)建導航控制器的方法,包括對控制器聲明周期的控制介紹,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2016-01-01
深入詳解Objective-C中的@Synchronized關鍵字
這篇文章主要為大家介紹了深入詳解Objective-C中的@Synchronized關鍵字,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03
深入解析iOS應用開發(fā)中對設計模式中的橋接模式的使用
這篇文章主要介紹了iOS應用開發(fā)中對設計模式中的橋接模式的使用,bridge橋接模式中主張把抽象部分與實現(xiàn)部分分離,需要的朋友可以參考下2016-03-03

