什么是ObjCTypes?

先看一下消息轉(zhuǎn)發(fā)流程:

消息轉(zhuǎn)發(fā)流程

在forwardInvocation這一步,你必須要實(shí)現(xiàn)一個(gè)方法:

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector OBJC_SWIFT_UNAVAILABLE("");

該方法用于說(shuō)明消息的返回值和參數(shù)類(lèi)型。NSMethodSignature是方法簽名,它是用來(lái)記錄返回值和參數(shù)類(lèi)型的一個(gè)對(duì)象??匆幌屡c該類(lèi)相關(guān)的方法:


//在NSMethodSignature.h中
+ (nullable NSMethodSignature *)signatureWithObjCTypes:(const char *)types;   //1

//在NSObject.h中
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector OBJC_SWIFT_UNAVAILABLE("");  //2

+ (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)aSelector OBJC_SWIFT_UNAVAILABLE("");   //3

2和3兩個(gè)方法是根據(jù)SEL來(lái)構(gòu)造NSMethodSignature,而1方法則是今天的主角,那里面的types究竟是什么呢?
根據(jù)1的方法名稱可以猜想,types是ObjCTypes,它是一個(gè)是字符串?dāng)?shù)組,該數(shù)組包含了方法的類(lèi)型編碼。那如果我們用該方法實(shí)例化NSMethodSignature的時(shí)候究竟如何寫(xiě)types呢?先來(lái)舉個(gè)例子:

- (void)goToSchoolWithPerson:(Person *)person;

[zhangsan goToSchoolWithPerson:lisi];

其ObjcTypes就是 "v@:@"。那究竟是如何得來(lái)該字符串呢?其實(shí)我們有兩種方式:

  1. 直接查表。在Type Encodings里面列出了對(duì)應(yīng)關(guān)系。
  2. 使用 @encode()計(jì)算。( NSLog(@"%s",@encode(BOOL))的結(jié)果為B )

我們都知道消息發(fā)送會(huì)被轉(zhuǎn)換成objc _ msgSend(id reciever,SEL sel,prarams1,params2,....)。所以上面的方法會(huì)被轉(zhuǎn)換成:

void objc_msgSend(zhangsan,@selector(goToSchoolWithPerson:),lisi);   //包含兩個(gè)隱藏參數(shù)

這里的 “v@:@”就代表:

  • "v":代表返回值void
  • "@":代表一個(gè)對(duì)象,這里指代的id類(lèi)型zhangsan,也就是消息的receiver
  • ":":代表SEL
  • "@":代表參數(shù)lisi

再舉個(gè)例子:


- (BOOL)ifSuccess:(NSString *)tag

其ObjCTypes為:"B@:@",其中:

  • "B":代表BOOL。 // NSLog(@"%s",@encode(BOOL))的結(jié)果為B
  • "@":一個(gè)id類(lèi)型的對(duì)象,第一個(gè)參數(shù)類(lèi)型,也就是objc _ msgSend的第一個(gè)參數(shù)
  • ":":代表對(duì)應(yīng)的SEL,第二個(gè)參數(shù)
  • "@":一個(gè)id類(lèi)型的對(duì)象,也就是tag。

到此,我們就知道了該如何書(shū)寫(xiě)ObjCTypes了。

1.Type Encodings

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,101評(píng)論 0 9
  • 我們常常會(huì)聽(tīng)說(shuō) Objective-C 是一門(mén)動(dòng)態(tài)語(yǔ)言,那么這個(gè)「動(dòng)態(tài)」表現(xiàn)在哪呢?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,351評(píng)論 0 7
  • 參考鏈接: http://www.cnblogs.com/ioshe/p/5489086.html 簡(jiǎn)介 Runt...
    樂(lè)樂(lè)的簡(jiǎn)書(shū)閱讀 2,252評(píng)論 0 9
  • 本文轉(zhuǎn)載自:http://yulingtianxia.com/blog/2014/11/05/objective-...
    ant_flex閱讀 892評(píng)論 0 1
  • 當(dāng)秧苗從旱地移栽到水田的時(shí)候,也就是去牯嶺的時(shí)候了。也許正是從那時(shí)起,我腦海中對(duì)于中國(guó)的記憶始終帶著一種濃厚的芳香...
    橙妮妮閱讀 397評(píng)論 2 2

友情鏈接更多精彩內(nèi)容