什么是Runtime
Runtime簡稱運(yùn)行時(shí)。
Objective-C是一門運(yùn)行時(shí)語言,,所謂運(yùn)行時(shí),,就是在程序運(yùn)行時(shí),才會(huì)去確定對(duì)象的類型,,并調(diào)用類與對(duì)象對(duì)應(yīng)的方法。
消息機(jī)制
在Objective-C中,,函數(shù)的調(diào)用稱為消息發(fā)送,,即objc_msgSend,屬于動(dòng)態(tài)調(diào)用過程,。
消息發(fā)送與方法的真正實(shí)現(xiàn)是在程序運(yùn)行階段綁定的,,而非編譯階段。
編譯器會(huì)將消息發(fā)送轉(zhuǎn)換成對(duì)objc_msgSend方法的調(diào)用,。
消息函數(shù)objc_msgSend
在Objective-C中,,我們這樣調(diào)用一個(gè)函數(shù),如下:
- [someObject messageName:parameter];
編譯器看到上面的代碼,,會(huì)將其轉(zhuǎn)換為一條標(biāo)準(zhǔn)的C語言函數(shù)調(diào)用,,所調(diào)用的函數(shù)就是消息機(jī)制中的核心函數(shù),,即objc_msgSend。如下:
- objc_msgSend(someObject,@selector(messageName:),parameter);
objc_msgSend函數(shù)含兩個(gè)必要參數(shù):receiver,、方法名(即selector),,即:objc_msgSend(receiver, selector);
當(dāng)然,也可以同時(shí)接受消息中的任意數(shù)目的參數(shù),,即:objc_msgSend(receiver, selector, arg1, arg2, …);
消息函數(shù)objc_msgSend做了動(dòng)態(tài)綁定所需要的一切:
1.它首先找到selector所對(duì)應(yīng)的方法實(shí)現(xiàn),。因?yàn)椴煌念悓?duì)同一方法可能會(huì)有不同的實(shí)現(xiàn),所以找到的方法實(shí)現(xiàn)依賴于消息接收者的類型,。
2.然后將消息接收者對(duì)象(指向消息接收者對(duì)象的指針)以及方法中指定的參數(shù)傳給找到的方法實(shí)現(xiàn),。
3.最后,將方法實(shí)現(xiàn)的返回值作為該函數(shù)的返回值返回,。
objc_msgSend手動(dòng)調(diào)用
新建Person類,,如下:
Person.h
- #import <Foundation/Foundation.h>
-
- @interface Person : NSObject
- @property (nonatomic, assign) int age;
- @end
在控制器的viewDidLoad方法里手動(dòng)調(diào)用objc_msgSend方法,特別注意要導(dǎo)入objc/runtime.h頭文件,,如下:
- #import "ViewController.h"
- #import "Person.h"
- #import <objc/runtime.h>//導(dǎo)入runtime頭文件
-
- @interface ViewController ()
- @end
-
- @implementation ViewController
-
- - (void)viewDidLoad {
- [super viewDidLoad];
-
- Person *p = [[Person alloc]init];
-
- objc_msgSend(p, @selector(setAge:), 18);//對(duì)應(yīng)p.age=18;在底層被轉(zhuǎn)換成的代碼
-
- NSLog(@"p的Age是:%d", p.age);
- }
-
- @end
運(yùn)行,,打印結(jié)果如下:
2015-03-24 16:12:01.105 objc_msgSendTest[4461:70b] p的Age是:18
個(gè)人原創(chuàng),歡迎轉(zhuǎn)載,,轉(zhuǎn)載請(qǐng)注明出處:http://blog.csdn.net/iosHot
|