亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

詳解iOS 用于解決循環引用的block timer

2019-10-21 18:22:03
字體:
來源:轉載
供稿:網友

一、什么是回調函數?

回調函數,本質上也是個函數(擱置函數和方法的爭議,就當這二者是一回事)。由“聲明”、“實現”、“調用”三部分組成。

在上面的例子中,我可以看出,函數amount(其實是Block),的聲明和調用在A類中,而實現部分在B類中。也就是說,B類實現了amount函數,但并沒有權限調用,最終還是 由A類觸發調用。我們稱這樣的機制為“回調”。意思是“雖然函數的實現寫在B類中,但是真正的調用還是得由A類來完成。”正常函數“函數聲明、實現均在一個類中完成。”

一句大白話理解“回調”的概念:“函數的實現部分雖然不在老家(A類),但是最終的調用還是由老家人完成”,這樣的函數就叫做回調函數。“老家人調用你,就叫回調,因為你本來就屬于老家。

用《無間道》理解“回調函數”概念:

香港警務處(類):

招聘了一名警察張三(聲明函數),并培養、訓練他(實現函數)。

招聘了一名警察陳仁貴(聲明函數),但并沒有培養他,而是被送進了三合會。但有任務的時候,警務處會調用陳仁貴(回調函數)。

廉政總署(類):使用警務處的張三(普通調用)。

三合會(類):培養、訓練陳仁貴(實現函數)。

第二個問題:什么情況下使用回調函數?

假設有A、B兩個類。

(1)A類有多種形態,要在B類中實現回調函數。如假設A類是網絡請求開源類ASIHttpRequest,它可能請求成功,也可能請求失敗。這個時候,B類就要針對以上兩個情況,作不同的處理。

(2)A類的形態由B類決定時,要在B類中實現回調函數。如UITableView類就會提供很多回調函數(iOS專業術語稱“委托”方法)

(3)A類需要向B類傳遞數據時,可以在B類中實現回調函數(A類一般是數據層比較耗時的操作類)。如舉的那個發工資的例子。在實際編程中,這樣的機制有個好處就是可以提升用戶的操作體驗。比如用戶從X頁面跳轉到Y頁面,需要向網絡請求數據,而且比較耗時,那我們怎么辦?有三種方案:第一種就是在X頁面展示一個旋轉指示器,當收到網絡傳回的數據時,在展現Y頁面。第二種就是使用回調函數。用戶從X頁面直接跳轉到Y頁面,Y頁面需要到數據讓數據層去執行,當收到數據時,再在Y頁面展現。第三種就是在Y頁面中開啟多線程。讓一個子線程專門到后臺去取數據。綜合來說,第二種更加簡介易懂,而且代碼緊湊。

第三個問題:使用回調函數有什么好處?

(1)可以讓實現方,根據回調方的多種形態進行不同的處理和操作。(ASIHttpRequest)

(2)可以讓實現方,根據自己的需要定制回調方的不同形態。(UITableView)

(3)可以將耗時的操作隱藏在回調方,不影響實現方其它信息的展示。

(4)讓代碼的邏輯更加集中,更加易讀。

什么是回調函數?——就是由聲明函數的類來調用的函數叫做回調函數。普通函數可以讓任何類調用。

“回調”的主語是誰?——聲明“回調函數”的那個類。

Block、委托、通知、回調函數,它們雖然名字不一樣,但是原理都一樣,都是“回調機制”的思想的具體實現!

iOS 10的時候NSTimer新增了一個帶block的API:

 

復制代碼代碼如下:
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(void (^)(NSTimer *timer))block API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));

 

蘋果的官方文檔里說,將這個timer本身作為參數傳給block以此來避免循環引用:

/// - parameter:  block  The execution body of the timer; the timer itself is passed as the parameter to this block when executed to aid in avoiding cyclical references

有了這個API再也不需要繁瑣的手動注銷timer,結合weakSelf就可以輕松處理循環引用,如:

__weak typeof(self) weakSelf = self;self.timer = [NSTimer scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {  __strong typeof(self) strongSelf = weakSelf;  [strongSelf printNum];}];

在這個API出現之前,self和timer的引用關系是:self->timer->self

現在的引用關系是:self->timer->weakSelf

但是只有iOS 10及之后的系統才能使用此API,而我們一般都是適配到iOS 8,所以有必要擴展一下。

如何擴展?

簡單點,寫個category,直接復制蘋果的API進去(思考API設計的時間都省了
注:相關教程知識閱讀請移步到IOS開發頻道。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩美女av在线免费观看| 欧美亚洲一级片| 久久精品中文字幕免费mv| 久久亚洲国产精品成人av秋霞| 欧美激情视频给我| 国产日韩欧美黄色| 26uuu另类亚洲欧美日本老年| 一本大道香蕉久在线播放29| 欧美日本在线视频中文字字幕| 成人精品视频久久久久| 久久天天躁狠狠躁夜夜躁2014| 亚洲人成伊人成综合网久久久| 午夜精品久久久久久久久久久久| 国产欧美日韩精品专区| 国产91亚洲精品| 久久精品成人欧美大片古装| 久久6免费高清热精品| 欧美大片va欧美在线播放| 一区二区三区高清国产| 91精品国产乱码久久久久久久久| 91精品国产综合久久久久久久久| 亚洲国产另类久久精品| 91精品久久久久久| 国产精品日韩欧美综合| 国产精品视频xxx| 国产视频观看一区| 欧美一级视频在线观看| 亚洲无线码在线一区观看| 亚洲少妇中文在线| 亚洲精品久久久久中文字幕欢迎你| 国产精品一区二区电影| 精品久久久久久中文字幕| 国产91精品久久久久久| 国产精品色视频| 91免费福利视频| 中文字幕一区日韩电影| 欧美激情xxxx| 日韩欧美亚洲一二三区| 最近2019年中文视频免费在线观看| 91亚洲精品一区二区| 中文字幕在线看视频国产欧美在线看完整| 91在线视频成人| 久久99精品视频一区97| 超碰97人人做人人爱少妇| 日韩一级黄色av| 亚洲第一中文字幕在线观看| 亚洲mm色国产网站| 国产极品jizzhd欧美| 亚洲自拍偷拍视频| 日韩中文字幕第一页| 国产综合久久久久| 国模视频一区二区三区| 亚洲国产精品字幕| 国产日韩欧美一二三区| 最好看的2019年中文视频| 国产精品久久色| 欧美视频不卡中文| 欧美性猛交xxxx黑人猛交| 91中文精品字幕在线视频| 一本色道久久88综合日韩精品| 亚洲欧美日韩精品久久奇米色影视| 亚洲片在线观看| 亚洲网站在线观看| 欧美日韩国产麻豆| 欧美日在线观看| 国产欧美一区二区三区在线看| 国产午夜精品美女视频明星a级| 亚洲精品福利视频| 国产综合福利在线| 精品呦交小u女在线| 亚洲精品wwwww| 日韩中文字幕精品视频| 国产成人久久精品| 久久视频在线观看免费| 久久久久久久久久久免费| 成人免费观看a| 黄色精品一区二区| 欧美成人免费在线视频| 日本成人在线视频网址| 免费不卡在线观看av| 国产日韩欧美另类| 日韩h在线观看| 亚洲欧美国产一本综合首页| 91精品在线播放| 精品人伦一区二区三区蜜桃免费| 国产精品免费福利| 国产91成人在在线播放| 日韩专区在线观看| 97超级碰在线看视频免费在线看| 欧美日韩高清在线观看| 国产中文字幕亚洲| 97av在线影院| 在线视频免费一区二区| 亚洲欧美日韩国产中文专区| 91成人国产在线观看| 午夜欧美大片免费观看| 欧美激情国产高清| 中文字幕亚洲欧美在线| 福利二区91精品bt7086| 亚洲性69xxxbbb| 清纯唯美日韩制服另类| 欧美日韩亚洲视频一区| 91日本视频在线| 欧美在线一区二区三区四| 91色在线视频| 国语自产精品视频在免费| 久久久久久久久国产| 97视频在线观看播放| 亚洲一区二区三区视频播放| 日韩欧美在线网址| 日韩视频欧美视频| 亚洲xxxx18| 日韩中文字幕视频在线| 亚洲第一页自拍| 亚洲视频axxx| 7m精品福利视频导航| 日韩一二三在线视频播| 国产精品igao视频| 亚洲男女自偷自拍图片另类| 精品久久久久久国产| 中文字幕日韩在线观看| 亚洲欧美日韩天堂| 国产午夜精品视频免费不卡69堂| 懂色aⅴ精品一区二区三区蜜月| 91地址最新发布| 午夜精品久久久久久99热| 一区二区三区四区在线观看视频| 久久久www成人免费精品| 亚洲午夜未满十八勿入免费观看全集| 热久久视久久精品18亚洲精品| 日韩欧美亚洲综合| 午夜美女久久久久爽久久| 激情成人在线视频| 欧美大片va欧美在线播放| www.日韩免费| 欧美日本高清一区| 日韩电影中文字幕在线观看| 久久影视电视剧免费网站| 91欧美激情另类亚洲| 亚洲电影免费在线观看| 日韩一区二区福利| 成人日韩在线电影| 亚洲aa中文字幕| 亚洲成色www8888| 国产精品自拍小视频| 国产精品久久久久久久久久免费| 亚洲国产精品久久精品怡红院| 日韩av一区在线观看| 最近2019中文免费高清视频观看www99| 欧美激情精品在线| 欧美网站在线观看| 亚洲国产天堂久久综合网| 亚洲一区二区三区sesese| 亚洲色图色老头| 亚洲香蕉成视频在线观看| 中文字幕欧美国内| 国产欧美精品一区二区三区介绍| 亚洲午夜未满十八勿入免费观看全集| 亚洲新声在线观看| 在线视频国产日韩| 色视频www在线播放国产成人| 91色琪琪电影亚洲精品久久| 亚洲欧美色婷婷| 日韩精品中文在线观看|