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

Objective-C委托模式回調機制詳解與對比

     編輯:關於C語言

Objective-C委托模式回調機制詳解與對比

一、委托模式核心思想

將特定功能委託給外部對象實現。組件定義協議規定委托人需實現的方法,使用者遵守協議並設置為委托人。實現組件與業務邏輯解耦。

二、生活類比:公司IPO委托財務顧問

// 協議:定義委托人需具備的能力
@protocol CompanyProtocol 
- (void)doIPO;
@end

// 公司類:持有委托人引用
@interface Company : NSObject
@property (nonatomic, strong) id agent; // 委托人
- (void)startIPO;
@end

@implementation Company
- (void)startIPO {
    if (self.agent) [self.agent doIPO]; // 委托執行
}
@end

// 財務顧問:遵守協議實現具體操作
@interface FinanceAdvisor : NSObject 
@end
@implementation FinanceAdvisor
- (void)doIPO { NSLog(@"開始上市流程..."); }
@end

// 使用
FinanceAdvisor *advisor = [[FinanceAdvisor alloc] init];
Company *company = [[Company alloc] init];
company.agent = advisor;
[company startIPO]; // 實際調用advisor的doIPO

三、委托回調實戰:開關組件

1. 組件定義協議與委托屬性

@protocol SwitchDelegate 
// 狀態改變回調,攜帶新狀態參數
- (void)switchDidChangeState:(Switch *)switch newState:(SwitchState)state;
@end

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

2. 使用者遵守協議並實現

@interface Room : NSObject 
@property (strong, nonatomic) Light *light;
@property (strong, nonatomic) Switch *switch;
@end

@implementation Room
- (instancetype)init {
    self = [super init];
    if (self) {
        self.light = [[Light alloc] init];
        self.switch = [[Switch alloc] init];
        self.switch.delegate = self; // 自己作為委托人
    }
    return self;
}

// 實現委托方法
- (void)switchDidChangeState:(Switch *)sender newState:(SwitchState)state {
    if (state == SwitchStateOff) [self.light turnOff];
    else [self.light turnOn];
}
@end

四、委托模式 vs Target-Action

維度Target-ActionDelegate委托
綁定對象任意target + 任意selector遵守協議的delegate對象
方法定義調用者自定義組件預先在協議中聲明
參數傳遞通常僅sender協議定義,可攜帶豐富上下文
多實例區分需在action內判斷sender同樣需判斷,但協議可設計多方法
類型安全運行時檢查編譯期檢查(協議遵守)
適用組件簡單控件(按鈕、開關)複雜組件(表視圖、網絡層、文本輸入)

五、委托模式局限與Block改進

痛點:一個類作為多個同類組件委托時,所有回調進入同一方法,需通過sender判斷來源,代碼分散。

Block優勢:每個組件設置獨立Block回調,邏輯內聯,天然隔離(詳見《Objective-C Block回調機制》)。

六、工程規範建議

  1. 委托屬性必須用weak防止循環引用
  2. 協議繼承以便使用respondsToSelector:安全調用可選方法
  3. 協議方法命名規範:組件名+動作+上下文,如tableView:didSelectRowAtIndexPath:
  4. 可選方法用@optional標記,調用前檢查[delegate respondsToSelector:@selector(...)]
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved