回調(Callback)即事件觸發機制。組件在特定事件發生時,主動通知使用者。如開關狀態改變需通知燈具亮滅,開關無法預知使用者是誰,故需回調機制動態綁定處理邏輯。
蘋果Cocoa框架核心回調模式之一,包含兩要素:
id(任意對象)SEL(方法選擇器)SEL獲取方式:SEL action = @selector(methodName:);
@interface Light : NSObject - (void)turnOn; // 開燈 - (void)turnOff; // 關燈 @end
typedef enum : NSUInteger {
SwitchStateOff, // 默認關閉
SwitchStateOn
} SwitchState;
@interface Switch : NSObject
@property (nonatomic, assign, readonly) SwitchState currentState;
- (void)addChangeStateTarget:(id)target action:(SEL)action;
@end
@interface Room : NSObject
@property (nonatomic, strong) Light *light;
@property (nonatomic, strong) Switch *switch;
- (void)changeState:(Switch *)sender;
@end
@implementation Room
- (instancetype)init {
self = [super init];
if (self) {
self.light = [[Light alloc] init];
self.switch = [[Switch alloc] init];
// 設置回調:self為target,changeState:為action
[self.switch addChangeStateTarget:self action:@selector(changeState:)];
}
return self;
}
- (void)changeState:(Switch *)sender {
if (sender.currentState == SwitchStateOff)
[self.light turnOn];
else
[self.light turnOff];
}
@end
alloc/init)addChangeStateTarget:action:)綁定target與action[target performSelector:action withObject:self]| 優點 | 缺點 |
|---|---|
| 靈活:調用者自定義回調方法名 | 參數固定:通常僅傳送觸發對象(self),額外數據需通過對象屬性獲取 |
| 鬆耦合:組件不知target具體類型 | 一對一:一個控件僅支持一組target-action |
| 動態綁定:運行時決定 | 無編譯期檢查:selector拼寫錯誤運行時崩潰 |
適用於簡單控件(按鈕、開關、滑桿)的狀態變更通知。