美文网首页
扩展5—关于Objective-C type encoding

扩展5—关于Objective-C type encoding

作者: L_Ares | 来源:发表于2020-10-28 16:57 被阅读0次

本文为L_Ares个人写作,以任何形式转载请表明原文出处。

关于什么是type encoding,先往下看,看完了就知道了。

一、准备工作

先随便建一个可以在mac上跑的commond line tool

图1.png

然后就在main.m中随意的建一个类,我继承于了NSObject,大家可以随意,这不是重点。然后在main.m中我初始化一个JDPerson的实例对象。

#import <Foundation/Foundation.h>


@interface JDPerson : NSObject

@property (nonatomic,copy) NSString *jd_name;

@property (nonatomic,assign) int jd_age;

- (NSString *)study:(NSString *)something;

@end

@implementation JDPerson

- (NSString *)study:(NSString *)something
{
    return something;
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        
        JDPerson *person = [[JDPerson alloc] init];
        
        [person study:@"objc"];
        
        
        NSLog(@"Hello, World!");
    }
    return 0;
}

二、Clang编译成.cpp

进入到当前的typeEncodes项目main.m 所在的文件夹下。执行以下命令 :

clang -rewrite-objc main.m -o main.cpp

然后进到main.m所在的文件夹下,会发现多处了main.cpp的文件,打开它,搜索你自定的方法study,你会找到一个_method_list_t方法列表。

结果如下图所示 :

图2.png

看我画黄框的地方,这个东西就是本节要说的type encoding,类型编码。

三、举例说明

其实这个在苹果的开发者官网是有的,这里是Objective-C type encoding官网,有兴趣的可以自己看,我就举个例子说一下,这些符号都是什么。

因为会有一些地方要用到,所以在这里扩展记录。

我就以图2中画黄框的那个来举例,里面包含了返回值,包含了参数,算是比较全一点的。

1. type Encoding

  • 第一个@ : 一个对象(无论静态类型还是id类型),在这里指的就是那个NSString类型的一个返回值。

  • 24 : 24表示的是study这个方法占用的位数,不是说这个方法里面的实现,就是单指这个方法。

  • 第二个@ : 又是一个对象,这个就是统配类型,typedef struct objc_object *id,也就是你每个方法默认其实都是有一个id参数的。

  • 0 : 表示id这个参数在这个方法的0位上,因为id是结构体指针,所以0~7位都是id的。

  • 冒号: : 代表sel,方法编号。

  • 8 : 从第8位开始就是sel方法编号的存储位置了。

  • 第三个@ : 就是你传入的参数something这个对象

  • 16 : 就是从第16位开始是something的位置。

type Encoding的图 :

图3.png

2. Property Type

还有一个Property Type_prop_list_t里面。

拿图3中举例

图3.png
  • T : 就是Type,让你声明类型

  • @ : 表示变量类型,比如@后面的经过转译的NSString

  • C : 就是copy

  • N : 就是nonatomic

  • V : 表示成员变量,或者说实例变量。

再上一个Apple Developer官网的图 :

图4.png

相关文章

网友评论

      本文标题:扩展5—关于Objective-C type encoding

      本文链接:https://www.haomeiwen.com/subject/bltcvktx.html