Objective-C 採用動態消息分發,方法調用最終轉為 objc_msgSend(receiver, selector, args...)。運行時經歷多級查找與救援機制,保證極高的動態性。
retain/release/retainCount 等內存管理方法,直接返回接收者。receiver == nil 直接返回 0/nil/結構體零值。NSObject。
+resolveInstanceMethod:類可在運行時動態添加方法實現:
+ (BOOL)resolveInstanceMethod:(SEL)sel {
if ([NSStringFromSelector(sel) isEqualToString:@"makeSomeFood:"]) {
class_addMethod([Man class], sel, (IMP)makeVegetable, "v@:@");
return YES;
}
return [super resolveInstanceMethod:sel];
}
適用於「懶加載」方法實現,如 Core Data 動態生成存取器。
-forwardingTargetForSelector:將消息轉發給其他對象處理(如代理模式):
- (id)forwardingTargetForSelector:(SEL)aSelector {
if ([_wife respondsToSelector:aSelector]) return _wife;
return [super forwardingTargetForSelector:aSelector];
}
新接收者同樣會經歷完整查找流程。
-methodSignatureForSelector: + -forwardInvocation:構造 NSInvocation 封裝完整調用信息,交由任意目標處理:
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
NSMethodSignature *sig = [super methodSignatureForSelector:aSelector];
if (!sig && [RichFriend instancesRespondToSelector:aSelector])
sig = [RichFriend instanceMethodSignatureForSelector:aSelector];
return sig;
}
- (void)forwardInvocation:(NSInvocation *)inv {
if ([RichFriend instancesRespondToSelector:inv.selector])
[inv invokeWithTarget:[RichFriend new]];
else
[super forwardInvocation:inv];
}
此階段可修改參數、返回值,實現極靈活的 AOP、遠程調用等。
若所有救援失敗,NSObject 的 forwardInvocation: 拋出 doesNotRecognizeSelector: 異常,程序崩潰。

Objective-C 消息機制通過「緩存→列表→父類→動態解析→轉發目標→完整轉發」的層層遞進,實現了極致的動態性,也是 Cocoa 框架靈活性的基石。