iOS block和代理的區(qū)別

??這里主要是把block和代理作為回調(diào)的兩種方式虾宇,在應(yīng)用場(chǎng)景上進(jìn)行比較旨剥。block和代理本質(zhì)上是不同的,因?yàn)閎lock其實(shí)是一個(gè)對(duì)象臭墨,代理是一種設(shè)計(jì)模式(委托-代理模式)。

1.block簡(jiǎn)介

??在 iOS中膘盖, block一共分三種胧弛。
??(1)全局靜態(tài) block尤误,不會(huì)訪問(wèn)任何外部變量,執(zhí)行完就銷毀结缚。

 ^{
        NSLog(@"Hello World!");
    }();

??(2)保存在棧中的 block损晤,當(dāng)函數(shù)返回時(shí)會(huì)被銷毀,和第一種的區(qū)別就是調(diào)用了外部變量红竭。

    [UIView animateWithDuration:3 animations:^{
        self.view.backgroundColor = [UIColor redColor];
    }];

??(3)保存在堆中的 block尤勋,當(dāng)引用計(jì)數(shù)為 0 時(shí)會(huì)被銷毀。例如按鈕的點(diǎn)擊事件茵宪,一直存在最冰,即使執(zhí)行過(guò),也不銷毀眉厨,因?yàn)榘粹o還可能被點(diǎn)擊锌奴。直到持有按鈕的View被銷毀,它才會(huì)被銷毀憾股。

#import <UIKit/UIKit.h>

typedef void(^ButtonClickBlcok)();

@interface TestView : UIView

@property (nonatomic, copy) ButtonClickBlcok buttonClickBlcok;

@end

#import "TestView.h"

@implementation TestView

- (IBAction)buttonClick:(id)sender {
    if (self.buttonClickBlcok) {
        self.buttonClickBlcok();
    }
}
@end

2.代理簡(jiǎn)介

??在為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)鹿蜀。在某些情況下,一個(gè)對(duì)象不適合或者不能直接引用另一個(gè)對(duì)象服球,而代理對(duì)象可以在客戶端和目標(biāo)對(duì)象之間起到中介的作用茴恰。摘自百度百科
??代理是一種通用設(shè)計(jì)模式,很多語(yǔ)言上都有實(shí)現(xiàn)斩熊。在iOS中往枣,代理作為一種消息傳遞方式,使用的非常普遍粉渠。代理包括三部分:代理分冈,委托,協(xié)議霸株。代理方通過(guò)實(shí)現(xiàn)協(xié)議里的方法雕沉,接收委托方傳遞過(guò)來(lái)的消息。

3.block的優(yōu)勢(shì)

??block的代碼可讀性更好去件。因?yàn)閎lock只要實(shí)現(xiàn)就可以了坡椒,而代理需要遵守協(xié)議并且實(shí)現(xiàn)協(xié)議里的方法,而兩者還不在一個(gè)地方尤溜。代理使用起來(lái)也更麻煩倔叼,因?yàn)橐暶鲄f(xié)議、聲明代理屬性宫莱、遵守協(xié)議丈攒、實(shí)現(xiàn)協(xié)議里的方法僚纷。block不需要聲明及志,也不需要遵守缕棵,只需要聲明屬性和實(shí)現(xiàn)就可以了入愧。
??block是一種輕量級(jí)的回調(diào),可以直接訪問(wèn)上下文深碱,由于block的代碼是內(nèi)聯(lián)的,運(yùn)行效率更高藏畅。block就是一個(gè)對(duì)象敷硅,實(shí)現(xiàn)了匿名函數(shù)的功能。所以我們可以把block當(dāng)做一個(gè)成員變量愉阎、屬性绞蹦、參數(shù)使用,使用起來(lái)非常靈活榜旦。像用AFNetworking請(qǐng)求數(shù)據(jù)和GCD實(shí)現(xiàn)多線程幽七,都使用了block回調(diào)。

4.block劣勢(shì)

??blcok的運(yùn)行成本高溅呢。block出棧需要將使用的數(shù)據(jù)從棧內(nèi)存拷貝到堆內(nèi)存澡屡,當(dāng)然對(duì)象的話就是引用計(jì)數(shù)加1,使用完或者block置nil后才銷毀咐旧。delegate只是保存了一個(gè)對(duì)象指針(一定要用week修飾delegate驶鹉,不然也會(huì)循環(huán)引用),直接回調(diào)铣墨,沒(méi)有額外消耗室埋。就像C的函數(shù)指針,只多做了一個(gè)查表動(dòng)作伊约。
??block容易造成循環(huán)引用姚淆,而且不易察覺(jué)。因?yàn)闉榱薭lcok不被系統(tǒng)回收屡律,所以我們都用copy關(guān)鍵字修飾腌逢,實(shí)行強(qiáng)引用。block對(duì)捕獲的變量也都是強(qiáng)引用疹尾,所以就會(huì)造成循環(huán)引用上忍。

#import "ViewController.h"

typedef void(^TestBlock)(void);

@interface ViewController ()
{
    void (^_testCycleBlock)(void);
}
@end

@implementation ViewController

- (void)viewDidLoad {
  
    [super viewDidLoad];
    
    __weak ViewController *weakSelf = self;
    _testCycleBlock = ^{

        /**
          //引發(fā)循環(huán)引用
          NSLog(@"%@", self);
         */
        //防止循環(huán)引用
        NSLog(@"%@", weakSelf);
    };
}
@end

5.如何使用

??優(yōu)先使用block。
??如果回調(diào)的狀態(tài)很多纳本,多于三個(gè)使用代理窍蓝。
??如果回調(diào)的很頻繁,次數(shù)很多繁成,像UITableview吓笙,每次初始化、滑動(dòng)巾腕、點(diǎn)擊都會(huì)回調(diào)面睛,使用代理絮蒿。
??block和代理都各有優(yōu)缺點(diǎn),所以我們一定要理解區(qū)分使用場(chǎng)景叁鉴,應(yīng)用適合的回調(diào)方式土涝。優(yōu)化APP的性能,提高流暢性幌墓,從點(diǎn)滴做起但壮。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市常侣,隨后出現(xiàn)的幾起案子蜡饵,更是在濱河造成了極大的恐慌,老刑警劉巖胳施,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溯祸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡舞肆,警方通過(guò)查閱死者的電腦和手機(jī)焦辅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)胆绊,“玉大人氨鹏,你說(shuō)我怎么就攤上這事⊙棺矗” “怎么了仆抵?”我有些...
    開(kāi)封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)种冬。 經(jīng)常有香客問(wèn)我镣丑,道長(zhǎng),這世上最難降的妖魔是什么娱两? 我笑而不...
    開(kāi)封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任莺匠,我火速辦了婚禮,結(jié)果婚禮上十兢,老公的妹妹穿的比我還像新娘趣竣。我一直安慰自己,他們只是感情好旱物,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布遥缕。 她就那樣靜靜地躺著,像睡著了一般宵呛。 火紅的嫁衣襯著肌膚如雪单匣。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音户秤,去河邊找鬼码秉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鸡号,可吹牛的內(nèi)容都是我干的转砖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鲸伴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼堪藐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起挑围,我...
    開(kāi)封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎糖荒,沒(méi)想到半個(gè)月后杉辙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捶朵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蜘矢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片综看。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡品腹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出红碑,到底是詐尸還是另有隱情舞吭,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布析珊,位于F島的核電站羡鸥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏忠寻。R本人自食惡果不足惜惧浴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奕剃。 院中可真熱鬧衷旅,春花似錦、人聲如沸纵朋。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)倡蝙。三九已至九串,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背猪钮。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工品山, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烤低。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓肘交,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親扑馁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子涯呻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,090評(píng)論 1 32
  • 理論知識(shí)點(diǎn) NotificationCenter 通知中心:“一對(duì)多”,在APP中腻要,很多控制器都需要知道一個(gè)事件复罐,...
    朝雨晚風(fēng)閱讀 6,860評(píng)論 4 12
  • 基礎(chǔ) 1. 為什么說(shuō)Objective-C是一門動(dòng)態(tài)的語(yǔ)言? 2. 講一下MVC和MVVM雄家,MVP效诅? 3. 為...
    波妞和醬豆子閱讀 3,311評(píng)論 0 46
  • 夜晚的雨只有在路燈下才能看清,夜晚的風(fēng)只有沾上雨才能察覺(jué)趟济,整條街會(huì)只有你一個(gè)人乱投,就像電影一樣,孤獨(dú)的人深夜有雨陪伴...
    太七的貓閱讀 223評(píng)論 0 2
  • 年輕可以揮霍身體顷编,殊不知到老了戚炫,沒(méi)有好身體多受罪! 在這件事情上我常常跟老公發(fā)生沖突媳纬,他是無(wú)肉不歡双肤,還常常給女兒買...
    燦然加一新閱讀 325評(píng)論 0 2