日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

什么是ObjCTypes?

發布時間:2023/11/27 生活经验 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 什么是ObjCTypes? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

先看一下消息轉發流程:

在forwardInvocation這一步,你必須要實現一個方法:

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

該方法用于說明消息的返回值和參數類型。NSMethodSignature是方法簽名,它是用來記錄返回值和參數類型的一個對象。看一下與該類相關的方法:


//在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兩個方法是根據SEL來構造NSMethodSignature,而1方法則是今天的主角,那里面的types究竟是什么呢?
根據1的方法名稱可以猜想,types是ObjCTypes,它是一個是字符串數組,該數組包含了方法的類型編碼。那如果我們用該方法實例化NSMethodSignature的時候究竟如何寫types呢?先來舉個例子:

- (void)goToSchoolWithPerson:(Person *)person;[zhangsan goToSchoolWithPerson:lisi];

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

  1. 直接查表。在Type Encodings里面列出了對應關系。
  2. 使用 @encode()計算。( NSLog(@"%s",@encode(BOOL))的結果為B )

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

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

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

  • "v":代表返回值void
  • "@":代表一個對象,這里指代的id類型zhangsan,也就是消息的receiver
  • ":":代表SEL
  • "@":代表參數lisi

再舉個例子:


- (BOOL)ifSuccess:(NSString *)tag

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

  • "B":代表BOOL。 // NSLog(@"%s",@encode(BOOL))的結果為B
  • "@":一個id類型的對象,第一個參數類型,也就是objc _ msgSend的第一個參數
  • ":":代表對應的SEL,第二個參數
  • "@":一個id類型的對象,也就是tag。

到此,我們就知道了該如何書寫ObjCTypes了。

1.Type Encodings

轉載于:https://www.cnblogs.com/zhanggui/p/8251011.html

總結

以上是生活随笔為你收集整理的什么是ObjCTypes?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。