通知:“一對多”,在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的函數指針,只多做了一個查表動作