iOS開發小技巧之 WeakSelf巨集的進化

2021-09-02 16:44:27 字數 1601 閱讀 1508

我們都知道在防止如block的迴圈引用時,會使用__weak關鍵字做如下定義:

__weak typeof(self) weakself = self;

1後來,為了方便,不用每次都要寫這樣一句固定**,我們定義了巨集:

#define weakself __weak typeof(self) weakself = self;

1之後,我們可以比較方便的在需要的地方:

weakself;

...[weakself dosomething];12

3再後來,我們發現不止self需要使用weak,可能有部分變數也需要weak,於是我們的巨集繼續進化,不僅僅只支援self:

#define weakobj(o) __weak typeof(o) o##weak = o;

1這樣,後續對需要使用weak的物件,只要寫一句weakobj(obj) 即可使用objweak變數了(ps:發現沒有,這裡生成的變數名其實是objweak,並不是weakobj,原因見文章末的注1)

再後來,我們發現了一些小技巧,可以讓我們的這個巨集看起來更原生一些,我們新增了@符號在前面:

#define weakobj(o) autoreleasepool{} __weak typeof(o) o##weak = o;

1使用上看起來是這樣

@weakobj(self);

...[selfweak dosomething];12

3是不是感覺挺高大上的? 

這裡是利用了@autoreleasepool{}這個系統的關鍵字來實現的,其實還可以利用@try{}@finally{}這個也可以達到相同的效果,比如:

#define weakobj(o) try{}@finally{} __weak typeof(o) o##weak = o;

1這部分空的@try或者空的@autoreleasepool會在編譯時被優化掉,不必擔心效能問題。

至此,我們的巨集已經可以用了,但是實際使用中,出現了乙個很尷尬的問題,就是**自動補全,@w並不能自動提示出該巨集,所以每次都是很尷尬的先利用提示,寫完weakobj(obj),然後游標移動到前面去打上乙個@符號。 

這種事情怎麼能忍受? 

還好我們還有利器,xcode的codesnippet,任意方法內,寫一句**

@weakobj(<#obj#>);

1拖到xcode的codesnippet區域,快捷鍵設定為@weakobj即可。 

至此,愉快的使用@w即可自動補全出該巨集了。。

另外,還有相應的strong巨集,一併曬在這裡

#define strongobj(o) autoreleasepool{} __strong typeof(o) o = o##weak;

1用處嘛簡單寫個例子:

最後,揭曉為什麼該巨集生成的變數名是objweak: 

1. 使用時,如果開發者習慣性的要打出 [self dosomething]時,當他輸入self時,自動補全出來的部分能看到還有selfweak可供選擇,算是一種提醒方式。 

2. 如果weak前置,當然也可以,生成的會是weakobj這樣的變數名,只需要把巨集中o##weak 換成weak##o

好了,這篇文章希望對一些人有些啟發或幫助。

最後曬出個人在用的巨集定義:

《iOS之小技巧》

以後開發中常用的知識和小技巧 需要掌握的第三方框架 網路請求類 afnetworking 必須 asihttprequest 可能會用到,盡量掌握 資料庫 fmdb 瀑布流 第三方和系統自帶的.ps 系統自帶的瀑布流只支援ios6或者以上系統 抽屜效果 有多個如 mmdrawercontroller...

iOS開發小技巧總結

一 nslog的使用 nslog在除錯的時候,屢試不爽,可是在專案中用的太多,其實是會影響程式效能的,而且程式在非除錯模式下也看不到列印,多浪費資源呢?如果程式中使用的太多,發布前刪除又是乙個麻煩事,下個版本又要使用呢?因此,在pch檔案中,加乙個重寫列印的巨集,方便又安逸,還能提高逼格,經驗豐富的...

iOS 之開發中的幾個小技巧

funnypic.imageurl webview loadhtmlstring html baseurl nil imageview addsubview webview 11 插入載入更多 tableview reloaddata閃的問題 if requestarray requestarray...