国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS開發技巧之WeakSelf宏的進化詳解

2020-07-26 02:27:33
字體:
來源:轉載
供稿:網友

前言

本文主要給大家介紹了關于iOS之WeakSelf宏的進化的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。

WeakSelf宏的進化

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

__weak typeof(self) weakSelf = self;

后來,為了方便,不用每次都要寫這樣一句固定代碼,我們定義了宏:

#define WeakSelf __weak typeof(self) weakSelf = self;

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

WeakSelf;...[weakSelf doSomething];

再后來,我們發現不止self需要使用weak,可能有部分變量也需要weak,于是我們的宏繼續進化,不僅僅只支持self:

#define WeakObj(o) __weak typeof(o) o##Weak = o;

這樣,后續對需要使用weak的對象,只要寫一句WeakObj(obj) 即可使用objWeak變量了(PS:發現沒有,這里生成的變量名其實是objWeak,并不是weakObj,原因見文章末的注1)

再后來,我們發現了一些小技巧,可以讓我們的這個宏看起來更原生一些,我們添加了@符號在前面:

#define WeakObj(o) autoreleasepool{} __weak typeof(o) o##Weak = o;

使用上看起來是這樣

@WeakObj(self);...[selfWeak doSomething];

是不是感覺挺高大上的?

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

#define WeakObj(o) try{}@finally{} __weak typeof(o) o##Weak = o;

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

至此,我們的宏已經可以用了,但是實際使用中,出現了一個很尷尬的問題,就是代碼自動補全,@W并不能自動提示出該宏,所以每次都是很尷尬的先利用提示,寫完WeakObj(obj) ,然后光標移動到前面去打上一個@符號。

這種事情怎么能忍受?

還好我們還有利器,Xcode的CodeSnippet,任意方法內,寫一句代碼

@WeakObj(<#obj#>);

拖到Xcode的CodeSnippet區域,快捷鍵設置為@WeakObj即可。

至此,愉快的使用@W即可自動補全出該宏了。。

另外,還有相應的strong宏,一并曬在這里

#define StrongObj(o) autoreleasepool{} __strong typeof(o) o = o##Weak;

用處嘛簡單寫個例子:

@WeakObj(self);[var setBlock:^{ @StrongObj(self); [self doSomething];}];

關于這么寫的原因,請先自行揣摩,之后可以看看曉月的這篇文章:http://www.survivalescaperooms.com/article/140126.htm,也可以在評論中留言。

最后,揭曉為什么該宏生成的變量名是objWeak:

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

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

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

最后曬出個人在用的宏定義:

#define YRWeakObj(o) autoreleasepool{} __weak typeof(o) o##Weak = o;#define YRStrongObj(o) autoreleasepool{} __strong typeof(o) o = o##Weak;

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 同德县| 牙克石市| 开鲁县| 姜堰市| 鹰潭市| 绥中县| 阿克陶县| 东山县| 综艺| 静宁县| 泾川县| 苍梧县| 于田县| 丰城市| 阿拉善左旗| 施秉县| 浑源县| 嘉义市| 麻阳| 清水县| 莆田市| 遵化市| 万盛区| 建阳市| 临武县| 米脂县| 赣榆县| 上蔡县| 丰宁| 丰原市| 台湾省| 彭阳县| 包头市| 弋阳县| 辽中县| 隆子县| 抚远县| 定日县| 沂源县| 中江县| 通道|