久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Runtime之消息機(jī)制

 嘆落花 2015-03-24

什么是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ù),如下:

  1. [someObject messageName:parameter];   


編譯器看到上面的代碼,,會(huì)將其轉(zhuǎn)換為一條標(biāo)準(zhǔn)的C語言函數(shù)調(diào)用,,所調(diào)用的函數(shù)就是消息機(jī)制中的核心函數(shù),,即objc_msgSend。如下:
  1. 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

  1. #import <Foundation/Foundation.h>  
  2.   
  3. @interface Person : NSObject  
  4.   @property (nonatomic, assign) int age;  
  5. @end  

在控制器的viewDidLoad方法里手動(dòng)調(diào)用objc_msgSend方法,特別注意要導(dǎo)入objc/runtime.h頭文件,,如下:
  1. #import "ViewController.h"  
  2. #import "Person.h"  
  3. #import <objc/runtime.h>//導(dǎo)入runtime頭文件  
  4.   
  5. @interface ViewController ()  
  6. @end  
  7.   
  8. @implementation ViewController  
  9.   
  10. - (void)viewDidLoad {  
  11.     [super viewDidLoad];  
  12.   
  13.     Person *p = [[Person alloc]init];  
  14.   
  15.     objc_msgSend(p, @selector(setAge:), 18);//對(duì)應(yīng)p.age=18;在底層被轉(zhuǎn)換成的代碼  
  16.   
  17.     NSLog(@"p的Age是:%d", p.age);  
  18. }  
  19.   
  20. @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

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多