對于block和delegate的基本原理


通知:“一對多”,在APP中,很多控制器都需要知道一個事件,應該用通知;

delegate:

1,“一對一”,對同一個協議,一個對象只能設置一個代理delegate,所以單例對象就不能用代理;

2,代理更注重過程信息的傳輸:比如發起一個網絡請求,可能想要知道此時請求是否已經開始、是否收到了數據、數據是否已經接受完成、數據接收失敗

block:

1:寫法更簡練,不需要寫protocol、函數等等

2,block注重結果的傳輸:比如對于一個事件,只想知道成功或者失敗,并不需要知道進行了多少或者額外的一些信息

3,block需要注意防止循環引用:

ARC下這樣防止:

__weak typeof(self) weakSelf = self;

[yourBlock:^(NSArray *repeatedArray, NSArray *incompleteArray) {

[weakSelf doSomething];

}];

非ARC

__block typeof(self) weakSelf = self;

[yourBlock:^(NSArray *repeatedArray, NSArray *incompleteArray) {

[weakSelf doSomething];

}];

另外

delegate運行成本低。block成本很高的。

block出棧需要將使用的數據從棧內存拷貝到堆內存,當然對象的話就是加計數,使用完或者block置nil后才消除;delegate只是保存了一個對象指針,直接回調,沒有額外消耗。相對C的函數指針,只多做了一個查表動作

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 設計模式 1.delegate和notification什么區別,什么情況使用? 2.描述一下KVO和KVC。 K...
    丶逐漸閱讀 1,977評論 3 2
  • 目錄 屬性 修飾詞 循環引用 typeof與typedef 1. 屬性 objc所有類和對象都是c結構體,cate...
    Ryan___閱讀 360評論 0 1
  • 轉自李峰峰博客 一、概述 閉包 = 一個函數「或指向函數的指針」+ 該函數執行的外部的上下文變量「也就是自由變量」...
    Joshua520閱讀 1,012評論 0 0
  • iOS網絡架構討論梳理整理中。。。 其實如果沒有APIManager這一層是沒法使用delegate的,畢竟多個單...
    yhtang閱讀 5,252評論 1 23
  • 2017年12月17日,康聯智慧商家共享平臺運營商交流會圓滿舉行,本次會議召集吉林、黑龍江、遼寧、內蒙古等地區各級...
    康聯智慧商家閱讀 285評論 0 0