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)]@protocol UIApplicationDelegate@optional - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; - (void)applicationDidEnterBackground:(UIApplication *)application; - (void)applicationWillEnterForeground:(UIApplication *)application; // ... 十餘個生命周期回調 @end
設計精妙處:
UIApplication *,委托對象可反向調用單例服務。UIApplication 完全不知委托具體類,僅知遵循協議。@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]; } }
| 場景 | 推薦 | 理由 |
|---|---|---|
| 定義「是一種」關係,共享實現 | 繼承 | 代碼復用、Liskov 替換原則 |
| 定義「能做什麼」能力,跨類別層級 | 協議 | 解耦、多實現、可選方法、避免單繼承限制 |
| 系統框架回調 | 委托協議 | 蘋果生態標準模式 |
protocol 映射為 ObjC @protocol 需加 @objc。@objc optional 對應 @optional。weak var delegate: MyProtocol?。