精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

詳解Objective-C獲取消息工作機制

移動開發 iOS
本文介紹的是Objective-C如何獲取消息工作機制,很詳細的介紹了如何獲取消息的過程,我們來看詳細內容。

Objective-C獲取消息工作機制是本文要介紹的內容,看name mangling的時候,也講到了Objective-C的name mangling,于是又重新讀了一下Objective-C 2.0 programming Language以及Objective-C 2.0 Runtime Reference里的相關內容,自己歸納一下。

先貼一段代碼:

  1.    MyClass.h  
  2.    @interface MyClass : NSObject  
  3.    {  
  4.     }  
  5.    @end  
  6.    MyClass.m  
  7.    #import </usr/include/objc/runtime.h> 
  8.    #import “MyClass.h”  
  9.    void myClassIMP(id _rec, SEL _cmd, int theInt)  
  10.    {  
  11.       NSLog(@”dynamic added method:%d”,theInt);  
  12.    }  
  13.    
  14. - (id)init  
  15. {  
  16.     if( ( self = [super init]) != nil )  
  17.     {  
  18.    class_addMethod([MyClass class], @selector(dynGeneratedMethod:),(IMP)myClassIMP,”v@:i”);  
  19.      }  
  20.     return self;  
  21. }  
  22.  
  23. Main.c  
  24. #import “MyClass.h”  
  25. int main(int argc, char *argv[])  
  26. {  
  27.   MyClass theInstance = [[MyClass alloc] init];  
  28.   [theInstance dynGeneratedMethod:10];  
  29.  return 0;  

這段代碼執行的結果是在控制臺上輸出:

  1. dynamic added method:10 

接著來詳細分析一下上面的代碼:

在ObjC的類中這樣的一個聲明 – (void)foo:(int)a;被稱作方法(method),而在調用的地方: [theClass foo:10];則被稱之為發送消息(send message),具體來說是給對象theClass 發送foo:消息,注意這里foo后面的”:”,它也是消息名稱的一部分,最前面的'-'代表實例方法,'+'代表類方法。而類似的語句,在C或C++中,通常被稱為呼叫函數(call function),在ObjC中,函數(function)一詞很少用到,不是它不存在,而是它被ObjC runtime給隱藏了起來。
  
如前所述,ObjC是以消息機制來工作的,但其實諸如-(void)foo:(int)a的語句在編譯時被objc_msgSend(receiver,selector,arg1,arg2,….)替換了,所以其實每一條發送消息的代碼本質上還是調用函數(call function),不過他們調用的都是同一個函數objc_msgSend(也可能是objc_msgSend_stret(返回值是結構體),objc_msgSend_fpret(返回值是浮點型)等)

分析objc_msgSend的參數,第一個receiver的類型是id,代表接受消息的對象,第二個是selector代表接收對象的方法,后面的是該方法的參數,之前那條語句的被編譯器替換后就是:

  1. [theClass foo:10]  -> objc_msg(theClass,@selector(foo:),10); 

因為消息的接受對象和接受對象的方法都參數化,所以在運行時刻,接受對象和接受對象的方法都可以是動態的!

比如說程序里面可以這樣寫:

  1. id helper = getTheReceiver();  
  2. SEL request = getTheSelector();  
  3. [helper performSelector:request]; 

它的實現是基于ObjC runtime. NSObject類實現了這套機制,所以每一個繼承于NSObject的類都能自動獲得runtime的支持。在這樣的一個類中,有一個isa指針,指向該類定義的數據結構體,這個結構體是由編譯器編譯時為類(須繼承于NSObject)創建的.在這個結構體中有包括了指向其父類類定義的指針以及Dispatch table. Dispatch table是一張SEL和IMP的對應表。

對于名稱相同的方法,他們都有相同的SEL,方法的名稱不包括類名稱,所以子類和父類中的同名方法擁有相同的SEL,但是他們的實現可以各不相同,因而在他們各自的Dispatch表中SEL所對應的IMP是不同的,IMP是一個函數指針,而雖然每一個SEL對應的是一個方法的名稱,但考慮到效率,SEL本身是一個整型,編譯器會另外生成一張SEL和方法名稱對應的表。有了這樣的結構,objc就可以實現多態了。還是這行代碼:

  1. [theClass foo:10]; 

是向theClass發送了foo:消息,那么首先在theClass的類結構的Dispatch table里找有沒有對應的SEL,如果有的話,就表示theClass有響應該消息的方法,程序就跳到該方法的代碼地址頭(由IMP指定),開始執行。如果在theClass的Dispatch table找不到對應的SEL,那么就會通過isa所指的結構體中包含的父類指針,到父類里面去尋找,如果到最后還是沒有找到,就會出現runtime error.所以說,即使theClass以及它的父類都沒有定義-(void) foo:(int)a方法,程序還是可以通過編譯,但如果是用xcode的話,編譯器會有警告,告知theClass可能無法響應該消息。不會報錯的原因是類的方法也可以在執行時刻創建!上面的代碼:

  1. class_addMethod([MyClass class], @selector(dynGeneratedMethod:),(IMP)myClassIMP,”v@:i”); 

就是給MyClass類在執行時刻增加了一個響應dynGeneratedMethod:消息的方法,這樣之后對任何MyClass的instance類發送dynGeneratedMethod:消息,就會得到響應了.myClassIMP是類收到該消息時要調用的方法,其聲明如下:

  1. void myClassIMP(id _rec, SEL _cmd, int theInt) 

這個方法的前面兩個參數是必須的,之后的參數才是我們實際用到的參數,數目和@selector()中的冒號數一樣,冒號數代表的就是參數個數。第一個參數是消息的接受對象,是MyClass的實例,第二個參數是由SEL代表的具體消息。

 Class_addMethod的最后一個參數是表示dynGeneratedMethod:的返回值和參數信息,不過我自己試了一下,這個參數不起作用。

幾個要點:

1、對于C中被稱為函數(function)和函數調用(function call)的地方,在ObjC中被叫做方法(method)和發送消息(send message).試圖調用未定義的方法會導致編譯錯誤,而發送一條消息,即使沒有任何類定義了響應該消息的方法,編譯時也不會報錯,從語義上講這也是對的,發一條消息本來就不要求一定有人會響應,不過如果執行到發送消息的代碼時真的沒有類可以響應的話,是會發生runtime error,為了避免這種事情發生,可以先進行檢測,這樣寫:

  1. if( [myClass respondsToSelector:@selector(foo:)])  
  2. {  
  3.    [myClass foo:10];  

我感覺ObjC這樣的一套sender receiver的定義更注重面向對象的概念。類是一個接收者(receiver),如果定義了某個方法,就可以接收和這個方法名稱相同的消息。而使用該類的client(sender),則嘗試向該類發送消息.如果匹配了,就跳到類的方法里執行。

2、方法名稱是諸如foo:,不包括返回類型,參數類型,而又因為一個foo:對應于一個SEL,所以說ObjC不支持相同的foo:有不同的返回類型,也不支持重載。不過類方法和實例方法可以有相同的名字,而又有不同類型的參數和返回類型,因為它們不是處在同一張dispatch table中。

3、不僅類的方法可以運行時刻創建,類本身也可以在運行時刻創建,前面提到繼承于NSObject的類,編譯器會幫忙生成ObjC runtime所需要的類結構定義,只要我們在代碼里也按照那個結構創建了自己的類,那一樣可以獲得ObjC runtime的支持。 

小結:詳解Objective-C獲取消息工作機制的內容介紹完了,從Objective-C消息機制可以看出,它是一門很靈活的語言。最后希望本文對你有所幫助!

責任編輯:zhaolei 來源: 互聯網
相關推薦

2011-08-17 10:58:59

Objective-C構造函數

2011-07-29 16:16:30

Objective-c block

2014-04-01 10:50:42

iOS開發runtimeObjective-C

2011-07-18 16:36:51

Objective-C XCode

2015-10-08 10:01:10

Objective-CLayout

2011-08-17 10:29:39

Objective-C預處理

2011-08-18 13:28:35

Objective-C內存

2011-08-04 13:38:01

Objective-C C++

2011-08-15 14:32:42

Objective-C委托協議

2014-04-28 09:56:56

Objective-CiOS命名空間

2011-08-01 17:11:43

Objective-C 函數

2011-08-17 11:05:22

Objective-C方法

2011-07-27 16:55:12

Objective-c 閉包

2011-08-16 13:43:40

Objective-C文件cocoa

2011-08-16 10:23:04

Objective-CNSAutoreleaXcode常用鍵

2011-07-08 18:44:09

Objective-C Self Super

2011-07-29 15:47:21

iPhone開發 Objective- C

2011-08-10 18:07:29

Objective-C反射

2011-08-04 10:04:17

Objective-C 分類 協議

2011-08-16 13:34:23

Objective-C歸檔
點贊
收藏

51CTO技術棧公眾號

色黄视频在线观看| 内射无码专区久久亚洲| 国产精品传媒精东影业在线| 日韩欧美国产电影| 男女高潮又爽又黄又无遮挡| 成黄免费在线| 国产一区二区三区免费在线观看| 久久久久成人网| 国产手机在线观看| 国产精品亚洲一区二区在线观看| 亚洲成人免费观看| 亚洲国产一区二区在线| www.国产.com| 日韩成人一区二区| 欧美激情在线观看| 神马久久久久久久久久久| 欧美9999| 欧美日韩一卡二卡| 91精品91久久久中77777老牛| 麻豆av在线导航| 久久亚洲一级片| 亚洲综合精品一区二区| 国产精品777777| 欧美啪啪一区| 日韩在线观看免费高清完整版| 在线播放第一页| 色999久久久精品人人澡69 | 精品免费国产二区三区| 不要播放器的av网站| 免费男女羞羞的视频网站在线观看| 国产网站一区二区| 国产一区二区三区四区hd| 中文字幕在线日亚洲9| 日韩午夜在线电影| 欧美精品在线免费| 国产精品视频一区二区在线观看| 国产成人精品999在线观看| 亚洲高清久久网| 丰满人妻一区二区三区大胸| 国产原创一区| 在线观看日韩一区| 日批视频在线免费看| 91www在线| 亚洲国产日韩a在线播放性色| 中国一区二区三区| 欧美极品另类| 1024成人网色www| 亚洲免费久久| 日韩精品黄色| 亚洲特级片在线| 亚洲欧美日韩在线综合| 9i精品一二三区| 国产色综合一区| 日本视频精品一区| 国产在线播放av| 久久精品欧美一区二区三区麻豆| 欧美日韩一区二区三| 青青久在线视频免费观看| 26uuu亚洲| 日本电影一区二区三区| 奇米影视888狠狠狠777不卡| 91视视频在线观看入口直接观看www| 国产伦精品一区二区三区四区视频 | 欧美日本亚洲韩国国产| 久久国产精品久久久久久| 日韩成人短视频| 欧美在线首页| 国产69精品久久久久99| 日韩不卡视频在线| 日韩中文字幕av电影| 国产精品对白刺激| 91在线视频国产| 国产精品一区二区在线观看不卡| 成人片在线免费看| 色视频免费在线观看| 久久久www成人免费毛片麻豆| 日韩电影天堂视频一区二区| 夜级特黄日本大片_在线| 成人欧美一区二区三区小说| 青青在线视频免费观看| a天堂资源在线| 色乱码一区二区三区88| 天天综合网久久| 一区二区三区亚洲变态调教大结局 | 亚洲乱码国产乱码精品精98午夜 | 精品国产自在久精品国产| 无码人妻一区二区三区精品视频| 国产精品流白浆在线观看| 日韩精品一区二区三区第95| 少妇愉情理伦三级| 欧美国产专区| 日本高清+成人网在线观看| 怡红院男人天堂| 顶级嫩模精品视频在线看| 欧美人与物videos另类| 麻豆tv在线| 欧美性xxxx在线播放| 99日在线视频| 亚州国产精品| 久久艹在线视频| 在线永久看片免费的视频| 激情成人综合网| 欧美日韩一区二区三区在线观看免| 欧美成人三区| 日韩欧美在线观看视频| 在线一区二区不卡| 亚洲精品白浆高清| 欧美成人合集magnet| 狠狠人妻久久久久久综合| 国精品**一区二区三区在线蜜桃 | 日韩伦理一区| 性欧美视频videos6一9| 91一区二区视频| 国产网红主播福利一区二区| 成人性生活视频免费看| 国产精品日本一区二区三区在线| 亚洲精品资源美女情侣酒店| 久久久久久久中文字幕| 美女视频黄久久| 欧美不卡三区| 国产福利电影在线播放| 欧美一区二区三区视频免费播放| 久久久久亚洲av无码专区桃色| 欧美 日韩 国产一区二区在线视频| 国产精品久久久久久久7电影| 天天躁日日躁狠狠躁伊人| 亚洲精品写真福利| 日本三级黄色网址| av资源久久| 日本成熟性欧美| 日本大片在线观看| 天涯成人国产亚洲精品一区av| 涩多多在线观看| 99久久精品国产亚洲精品 | 日韩一级特黄毛片| 涩涩涩久久久成人精品| 在线观看亚洲视频| 国产精品乱码一区二区视频| www亚洲一区| 熟女少妇在线视频播放| 成人av资源网址| 欧美激情精品久久久久久黑人| 国产毛片毛片毛片毛片毛片| 国产精品久久久久aaaa| 中文字幕 日韩 欧美| 97精品中文字幕| 国产中文字幕日韩| 老司机精品影院| 欧美日本视频在线| 欧美色视频一区二区三区在线观看| 麻豆成人久久精品二区三区小说| 婷婷四月色综合| 国产精品蜜月aⅴ在线| 神马国产精品影院av| 在线观看国产成人| 中文字幕在线播放不卡一区| 福利视频999| 欧美激情成人在线| 国产精品视频在线免费观看 | 亚洲欧洲国产视频| 欧美日韩免费观看一区=区三区| 91中文字幕一区| 高清电影在线观看免费| 亚洲国模精品一区| 麻豆成人免费视频| 国产精品美女久久久久久久久久久 | 成人国产综合| 中文字幕精品久久久久| 国产毛片毛片毛片毛片| 亚洲午夜羞羞片| 添女人荫蒂视频| 免费观看久久久4p| 成年人三级视频| 久久九九热re6这里有精品| 欧美孕妇与黑人孕交| 波多野结衣在线网站| 51久久夜色精品国产麻豆| 国产一级特黄视频| 久久久天堂av| 久久综合桃花网| 国产女优一区| 伊人久久青草| 精品视频自拍| 成人精品在线视频| √最新版天堂资源网在线| 亚洲丝袜av一区| jlzzjlzz亚洲女人18| 日韩欧美国产激情| 波多野结衣欲乱| av在线免费不卡| 日本 片 成人 在线| 欧美日韩一区自拍| 热re99久久精品国产99热| 人人九九精品视频| 国产99久久精品一区二区永久免费 | 国产亚洲制服色| 不卡的一区二区| 全国精品久久少妇| 被灌满精子的波多野结衣| 残酷重口调教一区二区| 成人国产1314www色视频| 欧美韩国亚洲| 午夜精品久久17c| 免费在线看黄| 亚洲男人天天操| 成人毛片在线免费观看| 欧美日本韩国一区| 黑人精品无码一区二区三区AV| 亚洲激情自拍视频| 91精品久久久久久久久久久久| 成人h动漫精品一区二区| 加勒比av中文字幕| 肉丝袜脚交视频一区二区| 日本人体一区二区| 国产精品精品| 天天爽天天狠久久久| 国产精品45p| 岛国视频一区免费观看| 欧美天堂一区二区| 国产精品69av| 五月天av在线| 孩xxxx性bbbb欧美| 成人在线app| 日韩一中文字幕| www.中文字幕久久久| 亚洲男女性事视频| 天堂影院在线| 亚洲福利精品在线| 亚洲乱码在线观看| 91精品国产一区二区人妖| 亚洲天堂中文字幕在线| 在线观看精品一区| 久久99国产综合精品免费| 亚洲午夜在线观看视频在线| 九九热精品免费视频| 亚洲蜜臀av乱码久久精品| 亚洲区一区二区三| 中文字幕在线免费不卡| 在线观看天堂av| 中文成人av在线| 黄色国产在线播放| 国产目拍亚洲精品99久久精品| 美女久久久久久久久久| 2020国产成人综合网| 不卡一区二区在线观看| 2020国产精品自拍| 人妻视频一区二区| 国产精品视频在线看| 欧美激情久久久久久久| 国产精品色哟哟网站| 国产又粗又猛又爽又黄的视频小说| 欧美激情自拍偷拍| 国产三级精品三级观看| 综合av第一页| 69av.com| 亚洲成人免费在线| 亚洲精品男人天堂| 在线精品视频免费观看| 伊人久久亚洲综合| 91精品国产欧美一区二区| 亚洲AV无码一区二区三区少妇 | 亚洲日本香蕉视频| 亚洲美女av在线| 日本欧美在线视频免费观看| 欧美成人国产va精品日本一级| 久久不射影院| 91av在线免费观看| av在线不卡精品| 91亚洲精品视频| 久久久精品国产**网站| 日韩高清国产精品| 天天做天天爱天天综合网| 成年人深夜视频| 久久99伊人| 99九九精品视频| 91丨porny丨中文| 免费一级suv好看的国产网站| 亚洲精品v日韩精品| 国产性猛交╳xxx乱大交| 欧美亚洲日本国产| 99久久久国产精品无码网爆 | 91久久精品在线| 高清一区二区三区| 日韩精品极品视频在线观看免费| 久久久久蜜桃| 一本大道熟女人妻中文字幕在线| 全国精品久久少妇| 中文字幕第3页| 国产精品网站导航| 日韩黄色三级视频| 欧美日韩成人综合天天影院| 国产综合视频在线| 中文字幕亚洲综合| 国产在线美女| 成人免费直播live| 最新国产精品视频| 桥本有菜av在线| 毛片一区二区| 久久人妻少妇嫩草av蜜桃| 欧美国产乱子伦| 伊人久久综合视频| 91精品免费在线| 国产鲁鲁视频在线观看免费| 久久久久久97| 综合久久av| 欧洲一区二区在线观看| 红桃视频欧美| www.污网站| 国产女人aaa级久久久级| 久久国产精品免费看| 日韩美女在线视频 | 综合欧美一区二区三区| 韩国av中文字幕| 亚洲精品在线一区二区| av免费网站在线观看| 国产男女猛烈无遮挡91| 亚洲综合图色| 一二三四视频社区在线| 国产精品一区在线观看你懂的| 五月婷婷婷婷婷| 色嗨嗨av一区二区三区| 色欲久久久天天天综合网| 欧美日本国产在线| 精品午夜视频| 熟妇熟女乱妇乱女网站| 男人操女人的视频在线观看欧美| 中文字幕狠狠干| 欧美性猛交xxxx偷拍洗澡| 欧性猛交ⅹxxx乱大交| 欧美韩日一区二区| 蜜桃在线一区| 51xx午夜影福利| 国产在线乱码一区二区三区| 国产一二三av| 欧美日韩中文国产| 国产精品久久久久久久龚玥菲| 日本视频久久久| 欧美欧美黄在线二区| av天堂永久资源网| 91视频免费播放| 依依成人综合网| 亚洲欧美成人在线| 成人va天堂| 婷婷四房综合激情五月| 毛片不卡一区二区| 国产农村妇女精品一区| 欧美日韩国产一级| 求av网址在线观看| 91久久在线观看| 在线精品国产| 国产51自产区| 黄色精品在线看| 久青草国产在线| 国产精品免费观看在线| 天天av综合| 可以看的av网址| 亚洲成人一区在线| 日本v片在线免费观看| 热久久视久久精品18亚洲精品| 视频一区中文| 手机免费av片| 亚洲一区二区在线免费观看视频| 你懂的网站在线| 国产suv精品一区二区三区88区| 精品日本12videosex| 亚洲国产精品三区| 亚洲摸摸操操av| 凸凹人妻人人澡人人添| 国产成人精品在线播放| 欧美hd在线| 性活交片大全免费看| 日韩欧美中文免费| 亚洲欧美视频一区二区| 99国产在线| 久久一综合视频| 亚洲一级二级片| 亚洲成人国产精品| 国产亚洲一区二区手机在线观看| 一区二区三区在线观看www| 成人一区二区三区| 波多野结衣电车| 九九综合九九综合| 天堂99x99es久久精品免费| 美女网站视频黄色| 亚洲一区二区三区四区五区黄| 国产高清av在线| av一区观看| 日韩电影在线免费| 91aaa在线观看| 中文字幕av一区中文字幕天堂| 青草伊人久久| 国产精品天天av精麻传媒| 亚洲欧美成人一区二区三区| 香蕉国产在线视频| 91精品国产综合久久香蕉的用户体验 | 中文字幕国产一区二区| 免费观看a视频| 成人美女av在线直播| 香蕉亚洲视频| 午夜写真片福利电影网|