13
Objective-C Runtime DaidoujiChen 20150702

Objective c runtime 分享

Embed Size (px)

Citation preview

Page 1: Objective c runtime 分享

Objective-C Runtime DaidoujiChen 20150702

Page 2: Objective c runtime 分享

Who am i

Page 3: Objective c runtime 分享

About Me

• 2008 - 2010 ASUS• 2011 - 2015 Start Up• 2015 ~ Hiiir

Page 4: Objective c runtime 分享

Message Forwarding

Page 5: Objective c runtime 分享

Message Forwarding

• 當我們傳遞 message 給一個 object, 而這個 object 無法 handle 時 , 會產生錯誤 .

• 在系統拋出錯誤之前 , 處理這個問題 , 避免 crash 的發生 .

Page 6: Objective c runtime 分享

Message Forwarding

• 在走到 doesNotRecognizeSelector: 之前 , 會經過下面這些 method.

Page 7: Objective c runtime 分享

Message Forwarding

1.+ (BOOL)resolveInstanceMethod:(SEL)name;

如果 object 可以處理這個 instance method, 回傳 YES, 不能處理 , 回傳 NO.

Page 8: Objective c runtime 分享

Message Forwarding

2. - (id)forwardingTargetForSelector:(SEL)aSelector;

決定無法被 handle 的 method, 將轉發給哪一個 object.

Page 9: Objective c runtime 分享

Message Forwarding

3.- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;

NSMethodSignature 裡面記載一個 method 的回傳型別 , 以及各個參數的型別 .

!! 注意 !! NSMethodSignature 中並沒有記載 selector.

Page 10: Objective c runtime 分享

Message Forwarding

3. - (void)forwardInvocation:(NSInvocation *)anInvocation;

NSInvocation 裡面主要有三個部分 , • target• selector• methodSignature當包含這三個元素的時候 , 便可以以 invoke 運行

Page 11: Objective c runtime 分享

Message Forwarding

所以我們有三個機會可以拯救 object 免於 crash 的命運 .

Page 12: Objective c runtime 分享

Q&A