91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-10-24 02:12:49 來源:腳本之家 閱讀:382 作者:月若無涯 欄目:移動開發

前言

本文主要給大家介紹了關于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即可。

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

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

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

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

用處嘛簡單寫個例子:

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

關于這么寫的原因,請先自行揣摩,之后可以看看曉月的這篇文章:https://www.jb51.net/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;

總結

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

林周县| 饶阳县| 塔河县| 贺兰县| 海林市| 正镶白旗| 嫩江县| 沙田区| 永德县| 嘉祥县| 翁牛特旗| 察雅县| 高密市| 怀远县| 苏尼特左旗| 青海省| 秭归县| 九龙坡区| 九龙城区| 松溪县| 贵定县| 三都| 太保市| 崇左市| 黄大仙区| 武强县| 屏东市| 玛纳斯县| 阿合奇县| 米脂县| 涿鹿县| 静海县| 花莲市| 丹江口市| 靖江市| 吉水县| 高阳县| 鹤庆县| 封开县| 林西县| 龙南县|