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

Objective-C 協議與委托模式深度解析:從 UIApplicationDelegate 看設計藝術

     編輯:關於C語言

Objective-C 的 **Protocol(協議)** 類似 Java/C# 的 Interface,但結合 **Delegate(委托)** 模式形成獨特的「協議導向編程」風格。本文以 UIApplicationDelegate 為核心案例,解析協議聲明、可選/必選方法、委托屬性聲明、運行時動態檢查、多委托擴展等進階用法。

協議定義與分類

@protocol MyProtocol
- (void)requiredMethod;           // 必選 (默認)
@optional
- (void)optionalMethod;           // 可選
@required
- (void)anotherRequiredMethod;    // 重新聲明必選
@end
  • 繼承:@protocol SubProtocol
  • 類遵循:@interface MyClass : NSObject
  • 運行時檢查:[obj conformsToProtocol:@protocol(MyProtocol)]

經典案例:UIApplicationDelegate

@protocol UIApplicationDelegate 
@optional
- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
- (void)applicationDidEnterBackground:(UIApplication *)application;
- (void)applicationWillEnterForeground:(UIApplication *)application;
// ... 十餘個生命周期回調
@end

設計精妙處:

  1. 全可選:App 只需關心的生命周期實現對應方法,無需空實現。
  2. 參數傳遞上下文:每個回調首參數均為 UIApplication *,委托對象可反向調用單例服務。
  3. 鬆耦合:UIApplication 完全不知委托具體類,僅知遵循協議。

委托屬性正確聲明(ARC 環境)

@interface MyClass : NSObject
// weak 避免循環引用,id 限制類型
@property (nonatomic, weak) id delegate;
@end

調用模式**:

if ([self.delegate respondsToSelector:@selector(applicationDidEnterBackground:)]) {
    [self.delegate applicationDidEnterBackground:app];
}

進階:多委托 / 廣播模式

單一 delegate 限制一對一,需一對多時可用 NSNotificationCenter 或自定義多播數組:

@property (nonatomic, strong) NSMutableArray> *delegates;

- (void)broadcastEvent {
    for (id d in self.delegates) {
        if ([d respondsToSelector:@selector(onEvent:)])
            [d onEvent:self];
    }
}

協議 vs 繼承:設計選擇指南

場景推薦理由
定義「是一種」關係,共享實現繼承代碼復用、Liskov 替換原則
定義「能做什麼」能力,跨類別層級協議解耦、多實現、可選方法、避免單繼承限制
系統框架回調委托協議蘋果生態標準模式

Swift 互操作提示

  • Swift protocol 映射為 ObjC @protocol 需加 @objc。
  • @objc optional 對應 @optional。
  • 委托屬性在 Swift 中用 weak var delegate: MyProtocol?。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved