最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS開發(fā)技巧之WeakSelf宏的進(jìn)化詳解

 更新時間:2018年05月15日 08:41:51   作者:月若無涯  
在程序中我們經(jīng)常用到Block,但寫weak self 時會比較繁瑣,下面這篇文章主要給大家介紹了關(guān)于iOS開發(fā)技巧之WeakSelf宏的進(jìn)化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們一起來看看吧

前言

本文主要給大家介紹了關(guān)于iOS之WeakSelf宏的進(jìn)化的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細(xì)的介紹吧。

WeakSelf宏的進(jìn)化

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

__weak typeof(self) weakSelf = self;

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

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

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

WeakSelf;
...
[weakSelf doSomething];

再后來,我們發(fā)現(xiàn)不止self需要使用weak,可能有部分變量也需要weak,于是我們的宏繼續(xù)進(jìn)化,不僅僅只支持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)的關(guān)鍵字來實現(xiàn)的,其實還可以利用@try{}@finally{}這個也可以達(dá)到相同的效果,比如:

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

這部分空的@try或者空的@autoreleasepool會在編譯時被優(yōu)化掉,不必?fù)?dān)心性能問題。

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

這種事情怎么能忍受?

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

@WeakObj(<#obj#>);

拖到Xcode的CodeSnippet區(qū)域,快捷鍵設(shè)置為@WeakObj即可。

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

另外,還有相應(yīng)的strong宏,一并曬在這里

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

用處嘛簡單寫個例子:

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

關(guān)于這么寫的原因,請先自行揣摩,之后可以看看曉月的這篇文章:http://m.fzitv.net/article/140126.htm,也可以在評論中留言。

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

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

2. 如果weak前置,當(dāng)然也可以,生成的會是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;

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

最新評論

吴堡县| 锦州市| 彰武县| 绵竹市| 岗巴县| 安徽省| 宁夏| 墨竹工卡县| 南康市| 西宁市| 赤水市| 平遥县| 乐山市| 潍坊市| 正定县| 县级市| 司法| 中江县| 清徐县| 陆川县| 宁陵县| 特克斯县| 岫岩| 西昌市| 东乡族自治县| 濉溪县| 疏附县| 恩施市| 孙吴县| 凤冈县| 邵东县| 澄迈县| 温泉县| 庄浪县| 宜兰县| 南郑县| 元氏县| 阿克苏市| 沙湾县| 吴堡县| 宁安市|