Delegate,Notification,Block

參考:http://www.ithao123.cn/content-8349585.html

1.Delegate(代理、委托)

代理幾乎是iOS開發(fā)中最常用的傳值方式铝耻,在項目中的AppDelegate就是使用的這種設(shè)計模式忽孽,不僅如此,還有很多原生的控件也使用的這種設(shè)計模式,比如:UITextFiled姊途,UITableView等等涉瘾。

Delegate的優(yōu)點(diǎn)和缺陷:

優(yōu)點(diǎn):

1.減少代碼的耦合性,使事件監(jiān)聽和事件處理相分離捷兰。

2.清晰的語法定義立叛,減少維護(hù)成本,較強(qiáng)的代碼可讀性贡茅。

3.不需要創(chuàng)建第三方來監(jiān)聽事件和傳輸數(shù)據(jù)秘蛇。

4.一個控制器可以實(shí)現(xiàn)多個代理,滿足自定義開發(fā)需求顶考,可選必選有較大的靈活性赁还。

缺點(diǎn):

1.實(shí)現(xiàn)委托的代碼過程比較繁瑣。

2.當(dāng)實(shí)現(xiàn)跨層傳值監(jiān)聽的時候?qū)⒓哟蟠a的耦合性驹沿,并且程序的層次結(jié)構(gòu)將變的混亂艘策。

3.當(dāng)對多個對象同時傳值響應(yīng)的時候,委托的易用性將大大降低渊季。

2.NotificationCenter(通知)

通知也是iOS開發(fā)中常用的一種傳值響應(yīng)方法朋蔫,例如在AVFoundation框架中的MPMoviePlayerController在監(jiān)聽播放狀態(tài)改變,播放停止等事件時使用的也正是NotificationCenter却汉。

NSNotification采用的單例設(shè)計模式驯妄,當(dāng)給通知中心注冊一個key以后,那么無論在什么地方只要給通知中心發(fā)送一個這個key的消息病涨,那么就實(shí)現(xiàn)了通信傳值富玷,注冊的通知的對象就會調(diào)用相應(yīng)的方法。

優(yōu)點(diǎn):

1.使用簡單既穆,代碼精簡赎懦。

2.解決了同時向多個對象監(jiān)聽相應(yīng)的問題。

3.傳值方便快捷幻工,Context自身攜帶相應(yīng)的內(nèi)容励两。

缺點(diǎn):

1.使用完畢后,要時刻記得注銷通知囊颅,否則將出現(xiàn)不可預(yù)見的crash当悔。

2.key不夠安全,編譯器不會監(jiān)測是否被通知中心正確處理踢代。

3.調(diào)試的時候動作的跟蹤將很難進(jìn)行盲憎。

4.當(dāng)使用者向通知中心發(fā)送通知的時候,并不能獲得任何反饋信息胳挎。

5.需要一個第三方的對象來做監(jiān)聽者與被監(jiān)聽者的中介饼疙。

3.Block(代碼塊)

Block是iOS4.0+ 和Mac OS X 10.6+ 引進(jìn)的對C語言的擴(kuò)展,用來實(shí)現(xiàn)匿名函數(shù)的特性

閉包是一個能夠訪問其他函數(shù)內(nèi)部變量的函數(shù)慕爬。

官方文檔中也提到了幾種Block的使用場合窑眯。

任務(wù)完成時回調(diào)處理

消息監(jiān)聽回調(diào)處理

錯誤回調(diào)處理

枚舉回調(diào)

視圖動畫屏积、變換

排序

優(yōu)點(diǎn):

1.語法簡潔,實(shí)現(xiàn)回調(diào)不需要顯示的調(diào)用方法磅甩,代碼更為緊湊炊林。

2.增強(qiáng)代碼的可讀性和可維護(hù)性。

3.配合GCD優(yōu)秀的解決多線程問題卷要。

缺點(diǎn):

1.Block中得代碼將自動進(jìn)行一次retain操作渣聚,容易造成內(nèi)存泄露。

2.Block內(nèi)默認(rèn)引用為強(qiáng)引用却妨,容易造成循環(huán)引用饵逐。

(二)注意事項

1.代理

在代理中調(diào)用方法的時候使用的是系統(tǒng)的子線程,因此彪标,當(dāng)使用Delegate進(jìn)行UI操作的時候,必須調(diào)用GCD的主線程方法:

dispatch_async(dispatch_get_main_queue(), <^(void)block>)掷豺,在block中寫進(jìn)行的UI操作代碼捞烟。

2.通知

在通知的使用過程中Crash的原因很多情況都是注冊觀察者以后沒有及時的注銷觀察者,當(dāng)然這個情況在非ARC時代比較常見当船,但是這并不是說在現(xiàn)在的ARC時代就不會出現(xiàn)這個問題题画。往往一旦出現(xiàn)問題就很難追查,所以還是要養(yǎng)成及時注銷的習(xí)慣德频。

由于通知的使用極其簡單苍息,往往能夠看到很多開發(fā)人員在開發(fā)過程中濫用NSNoticationCenter的現(xiàn)象。導(dǎo)致到處都是亂七八糟的通知壹置,代碼的可維護(hù)性和可讀性非常差竞思,即便是使用了宏定義也不能完全避免這些問題。比如在Debug的時候钞护,當(dāng)存在多個Observe的時候盖喷,簡直就是要人命的感覺,想死的心都有了难咕。在這方面Block和Delegate比Notification強(qiáng)太多了课梳。

3.Block

當(dāng)在Block中引用某個外部變量的時候,Block內(nèi)部只會進(jìn)行只讀拷貝余佃,這也就意味著暮刃,即便你在使用Block之前修改了那個外部變量的值,那么在你使用的Block里面它的值依舊是最開始的那個外部變量的值爆土。如果想要同步外部變量的值椭懊,那么就需要在block內(nèi)部引用變量時,在前面加上__block關(guān)鍵字雾消。

block本身是像對象一樣可以retain灾搏,和release挫望。但是,block在創(chuàng)建的時候狂窑,它的內(nèi)存是分配在棧(stack)上媳板,而不是在堆(heap)上。他本身的作于域是屬于創(chuàng)建時候的作用域泉哈,一旦在創(chuàng)建時候的作用域外面調(diào)用block將導(dǎo)致程序崩潰蛉幸。

(三)使用場景對比

1.回調(diào)方法

在日常的開發(fā)過程中,我們經(jīng)常會遇到一些完成之后的處理問題丛晦,比如完成網(wǎng)路請求之后的回調(diào)奕纫,或者頁面加載完成之后的回調(diào)等。這個時候我們一般使用的是前兩者方法烫沙,即Block或者Delegate匹层。

而在一對一傳輸回調(diào)的時候明顯Block的使用更加的簡單高效,只需要在代碼塊中執(zhí)行所需要的操作即可锌蓄。

在一對多的情況下升筏,Delegate更加能夠發(fā)揮出自己的優(yōu)勢。

2.跨層通信

有的時候我們需要實(shí)現(xiàn)在兩個毫無關(guān)聯(lián)的對象之間的通信瘸爽,這個時候如果使用Block或者Delegate就勢必會增加代碼的耦合性您访,這樣對于代碼的結(jié)構(gòu)來說是不健康的,因此這個時候使用Notification便是明智的選擇剪决。

3.UI響應(yīng)事件

用戶在與App的UI進(jìn)行互動的時候灵汪,總會需要App進(jìn)行交互響應(yīng),這個時候就毫無疑問的使用代理設(shè)計模式柑潦。而蘋果官方給出的建議也是可以肯定的享言,在Cocoa Touch框架中我們也可以在幾乎所有的UI交互控件的頭文件里看到Delegate的成員變量,也正是印證了在UI響應(yīng)事件上Delegate有著絕對的優(yōu)勢妒茬。

4.簡單值得傳遞

當(dāng)需要進(jìn)行簡單值得傳遞的時候担锤,比如子控件傳輸給父控件所點(diǎn)擊的IndexPath的時候,更加適合使用Block來傳值乍钻。因為肛循,如果只是為了傳這一個簡單的值而沒有特別的業(yè)務(wù)處理而定義一個協(xié)議,然后實(shí)現(xiàn)協(xié)議银择,設(shè)置代理再寫方法的話將十分麻煩多糠,得不償失,這個時候簡單高效的Block就可以完美的替代Delegate完成任務(wù)了浩考。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夹孔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搭伤,老刑警劉巖只怎,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異怜俐,居然都是意外死亡身堡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門拍鲤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贴谎,“玉大人,你說我怎么就攤上這事季稳∩谜猓” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵景鼠,是天一觀的道長仲翎。 經(jīng)常有香客問我,道長铛漓,這世上最難降的妖魔是什么谭确? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮票渠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芬迄。我一直安慰自己问顷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布禀梳。 她就那樣靜靜地躺著杜窄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪算途。 梳的紋絲不亂的頭發(fā)上塞耕,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機(jī)與錄音嘴瓤,去河邊找鬼扫外。 笑死,一個胖子當(dāng)著我的面吹牛廓脆,可吹牛的內(nèi)容都是我干的筛谚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼停忿,長吁一口氣:“原來是場噩夢啊……” “哼驾讲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤吮铭,失蹤者是張志新(化名)和其女友劉穎时迫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谓晌,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掠拳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了扎谎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碳想。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖毁靶,靈堂內(nèi)的尸體忽然破棺而出胧奔,到底是詐尸還是另有隱情,我是刑警寧澤预吆,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布龙填,位于F島的核電站,受9級特大地震影響拐叉,放射性物質(zhì)發(fā)生泄漏岩遗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一凤瘦、第九天 我趴在偏房一處隱蔽的房頂上張望宿礁。 院中可真熱鬧,春花似錦蔬芥、人聲如沸梆靖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽返吻。三九已至,卻和暖如春乎婿,著一層夾襖步出監(jiān)牢的瞬間测僵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工谢翎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捍靠,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓岳服,卻偏偏與公主長得像剂公,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吊宋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容