Top Banner
Objective-C Runtime DaidoujiChen 20150806
22

Objective c runtime 分享2

Aug 15, 2015

Download

Mobile

Jeff Lee
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Objective c runtime 分享2

Objective-C Runtime DaidoujiChen 20150806

Page 2: Objective c runtime 分享2

Review

2

Page 3: Objective c runtime 分享2

Review

• 快速的回顧⼀一下, 在⼀一個 message ⾛走到 doesNotRecognizeSelector: 會經過三個挽救的機會.

Page 4: Objective c runtime 分享2

Review1. + (BOOL)resolveInstanceMethod:(SEL)name; 2. - (id)forwardingTargetForSelector:(SEL)aSelector;

3. -(NSMethodSignature*)methodSignatureForSelector:(SEL)aSelector; - (void)forwardInvocation:(NSInvocation *)anInvocation;

Page 5: Objective c runtime 分享2

Message

5

Page 6: Objective c runtime 分享2

Message

幾乎每⼀一本基礎的 Objective-C 書裡⾯面都會講到, 所有的 Method 運⾏行調⽤用, 都可以視為

[reciver message];

Page 7: Objective c runtime 分享2

Message

reciver 是要運⾏行這個 Method 的 Object message 則是要被運⾏行的 Method name

ex: [normalObject invoke]; [NormalObject randomIntegerValue];

Page 8: Objective c runtime 分享2

Message

然⽽而, 確切要運⾏行的 reciver 是哪個 Object, compiler 並不知道, 真正由誰來執⾏行, 在 Runtime 的時候才會決定.

Page 9: Objective c runtime 分享2

Messagecompiler 只會將 Method 轉化為

[normalObject invoke]; to objc_msgSend(normalObject, @selector(invoke));

Page 10: Objective c runtime 分享2

Message

[NormalObject randomIntegerValue]; to objc_msgSend([NormalObject class], @selector(randomIntegerValue));

Page 11: Objective c runtime 分享2

Message

關於 objc_msgSend 做了什麼, 官⽅方網站這樣告訴我們.

Page 12: Objective c runtime 分享2

Message1. It first finds the procedure (method implementation) that the selector refers to. Since the same method can be implemented differently by separate classes, the precise procedure that it finds depends on the class of the receiver.

Page 13: Objective c runtime 分享2

Message2. It then calls the procedure, passing it the receiving object (a pointer to its data), along with any arguments that were specified for the method.

Page 14: Objective c runtime 分享2

Message3. Finally, it passes on the return value of the procedure as its own return value.

Page 15: Objective c runtime 分享2

Message

Page 16: Objective c runtime 分享2

Message

實際上, objc_msgSend ⼤大致上分為幾個動作

Page 17: Objective c runtime 分享2

Message

1. 檢查 reciver 是否為 nil

Page 18: Objective c runtime 分享2

Message

2. 檢查這個 method 的 IMP 是不是已經存在 class 的 cache

Page 19: Objective c runtime 分享2

Message3. 如果不存在, 則會⼀一直向上查找.

Page 20: Objective c runtime 分享2

Message

Page 21: Objective c runtime 分享2

Q&A

Page 22: Objective c runtime 分享2

ReferenceObjective-C Runtime Programming Guide

A Look Under the Hood of objc_msgSend()

Chapter 4 Assembly Language