狠狠撸

狠狠撸Share a Scribd company logo
Objective-C Runtime
DaidoujiChen 20150702
Who am i
About Me
? 2008 - 2010 ASUS
? 2011 - 2015 Start Up
? 2015 ~ Hiiir
Message Forwarding
Message Forwarding
? 當我們傳遞 message 給一個 object, 而這
個 object 無法 handle 時, 會產生錯誤.
? 在系統拋出錯誤之前, 處理這個問題, 避免
crash 的發生.
Message Forwarding
? 在走到 doesNotRecognizeSelector: 之前,
會經過下面這些 method.
Message Forwarding
1.+ (BOOL)resolveInstanceMethod:(SEL)name;
如果 object 可以處理這個 instance method, 回傳
YES, 不能處理, 回傳 NO.
Message Forwarding
2. - (id)forwardingTargetForSelector:(SEL)aSelector;
決定無法被 handle 的 method, 將轉發給
哪一個 object.
Message Forwarding
3. - (NSMethodSignature
*)methodSignatureForSelector:(SEL)aSelector;
NSMethodSignature 裡面記載一個 method 的回傳型
別, 以及各個參數的型別.
!! 注意 !! NSMethodSignature 中並沒有記載 selector.
Message Forwarding
3. - (void)forwardInvocation:(NSInvocation *)anInvocation;
NSInvocation 裡面主要有三個部分,
? target
? selector
? methodSignature
當包含這三個元素的時候, 便可以以 invoke 運行
Message Forwarding
所以我們有三個機會可以拯救 object 免於
crash 的命運.
Q&A
Reference
Objective-C Runtime Programming Guide
Objective-C Runtime Reference
NSObject
NSString
Type Encodings
Objective-C respondsToSelector

More Related Content

Objective c runtime 分享