| 模式 | 核心用途 | 耦合度 | 方向 | 負載能力 | 典型場景 |
|---|---|---|---|---|---|
| KVO | 屬性變化觀察 | 中(需知對象生命週期) | 單向 | 屬性值 | NSOperationQueue 監聽 operation 狀態 |
| Notification | 廣播消息 | 低(發送/接收雙向解耦) | 單向 | 任意(userInfo 字典) | Core Data 變更通知、跨層級通信 |
| Delegation | 傳值/傳事件 | 中(協議綁定雙方) | 雙向 | 任意(協議方法參數) | UITableViewDataSource/Delegate、自定義組件回調 |
| Block | 回調、異步完成 | 低(內聯定義) | 單向 | 任意(捕獲上下文變量) | NSURLSession completionHandler、動畫完成回調 |
| Target-Action | UI 事件響應 | 低(可 nil target 順響應鏈) | 單向 | 無(僅 selector) | UIButton 點擊、手勢識別 |
需要雙向通信? → 是 → Delegation
否
需要觀察特定對象屬性變化? → 是 → KVO
否
需要廣播給多個不知名接收者? → 是 → Notification
否
是 UI 事件(按鈕、手勢)? → 是 → Target-Action
否
需要捕獲上下文/異步回調? → 是 → Block
否 → Delegation (默認選擇)
isFinished、isExecuting、isCancelledNSManagedObjectContextDidChangeNotification 攜帶變更對象集合tableView:didSelectRowAtIndexPath: 傳遞 indexPath 負載dataTaskWithURL:completionHandler: 內聯處理回調邏輯self 需用 __weak 避免 retain cycle[btn addTarget:self action:@selector(tap:) forControlEvents:UIControlEventTouchUpInside]target=nil 時順響應鏈尋找處理者,極致解耦manager.complete = ^{
[manager otherAction]; // 捕獲 manager
[manager release];
};
// manager → block → manager 循環引用
manager.complete = ^{
[manager otherAction];
manager.complete = nil; // 打破循環
[manager release];
};
__weak typeof(self) weakSelf = self;
manager.complete = ^{
[weakSelf otherAction];
};
Operation 加入 Queue 後必會執行結束並移出,completionBlock 執行後自動釋放,循環引用臨時存在但必然被打破,相對安全。
NSURLConnection 僅支持 DelegationsendAsynchronousRequest:queue:completionHandler:(Block)NSURLSession 以 Block 為主流,保留 Delegate 用於進度、認證等高級場景