首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言入門

Objective-C 教程 5:委託模式與回調機制深度解析

     編輯:C 語言入門

委託模式核心概念

委託模式 是 Objective-C 獨有的組件化開發模式,透過協定定義介面、委託屬性持有實作者,實現「組件不關心具體實作,只關心行為契約」的鬆耦合架構。

生活場景類比:公司 IPO 委託財務顧問

// 1. 定義協定:公司對委託人的要求
@protocol CompanyProtocol 
- (void)doIPO;
@end

// 2. 公司類別:持有委託人屬性
@interface Company : NSObject
@property (nonatomic, strong) id onePerson; // 弱引用更佳
- (void)startIPO;
@end

@implementation Company
- (void)startIPO {
    if (self.onePerson && [self.onePerson respondsToSelector:@selector(doIPO)]) {
        [self.onePerson doIPO]; // 委託執行
    }
}
@end

// 3. 具體實作者:財務顧問
@interface Finance : NSObject 
@end

@implementation Finance
- (void)doIPO {
    NSLog(@"開始上市流程!");
}
@end

// 4. 組裝使用
int main() {
    Finance *consultant = [[Finance alloc] init];
    Company *company = [[Company alloc] init];
    company.onePerson = consultant; // 外部注入 (獵頭)
    [company startIPO]; // 公司啟動 -> 實際由 consultant 執行
}

委託 vs 合成 模式比較

委託回調實戰:開關控制燈泡

開關元件定義

@protocol SwitchDelegate; // 前向宣告

typedef NS_ENUM(NSUInteger, SwitchState) {
    SwitchStateOff,
    SwitchStateOn
};

@interface SwitchD : NSObject
@property (nonatomic, assign, readonly) SwitchState currentState;
@property (nonatomic, weak) id delegate; // 必須 weak 避免循環引用
@end

@protocol SwitchDelegate 
// 必須實作:狀態變更通知
- (void)switchD:(SwitchD *)switchObj didChangeState:(SwitchState)currentState;
@end

房間類別實作委託

// Room.h
#import "SwitchD.h"
#import "Light.h"

@interface Room : NSObject 
@end

// Room.m
@interface Room () 
@property (strong, nonatomic) Light *aLight;
@property (strong, nonatomic) SwitchD *aSwitch;
@end

@implementation Room
- (instancetype)init {
    self = [super init];
    if (self) {
        self.aLight = [[Light alloc] init];
        self.aSwitch = [[SwitchD alloc] init];
        self.aSwitch.delegate = self; // 自己作為委託人
    }
    return self;
}

// 實作委託方法
- (void)switchD:(SwitchD *)s didChangeState:(SwitchState)currentState {
    if (currentState == SwitchStateOff) {
        [self.aLight turnOff];
    } else {
        [self.aLight turnOn];
    }
}
@end

三種回調模式完整比較

維度合成模式委託模式
元件建立時機初始化時內部建立外部注入、延遲綁定
具體類別依賴強依賴 (import 具體類別)零依賴 (僅依賴協定)
靈活性低 (編譯期固定)高 (執行期切換實作)
典型場景功能固定的子模組可替換策略、外部擴充點
模式類型參數傳遞多組件區分適用場景
Target-Action簡單組件單一 sender 參數,其他需透過屬性取得靠 selector 不同區分按鈕、滑桿、手勢
委託回調複雜組件協定預先定義豐富參數需在方法內判斷 senderTableView、ScrollView、網路層
Block 回調現代首選Block 簽名定義參數,捕獲上下文每個組件獨立 Block,天然隔離非同步完成、動畫、簡單回調

委託模式最佳實踐

  1. 委託屬性必須用 weak:避免循環引用 (A 持有 B,B delegate 持有 A)
  2. 協定繼承 NSObject:獲得 respondsToSelector: 等方法,支援選擇性實作
  3. 使用 @optional 標記非必要方法:減少實作者負擔
  4. 命名規範:- (void)componentName:(Component *)component didSomething:(Type)param;
  5. 單一職責:一個協定專注一組相關回調,避免巨大協定

結語

委託模式是 Objective-C 組件化架構的基石。理解其「協定定義契約、外部注入實作、弱引用避免循環」三大核心,並能與 Target-Action、Block 回調靈活搭配,是打造高內聚、低耦合、可測試 iOS 應用的關鍵能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved