OC底层探索14-方法名Type Encodings

作者: Henry________ | 来源:发表于2021-06-11 12:40 被阅读0次

    在对cpp文件进行查看的时候,发现有一些特殊的符号很是常见,像这样的方法Sel-"v16@0:8"到底代表什么意义,这次决定把它搞搞清楚到底是什么。

    查看Clang编译文件(.cpp)

    //Clang默认依赖Foundation库
    //当前目录下:把目标文件编译成c++文件.pp
    clang -rewrite-objc main.m -o main.cpp
    
    //编译目标文件内有UIKit等其他库需要导入依赖,
    clang -rewrite-objc -fobjc-arc -fobjc-runtime=ios-13.0.0 -isysroot / Applications/Xcode.app/Contents/Developer/Platforms/ iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.0.sdk main.m
    
    //使用`xcode`安装安装的`xcrun`命令
    xcrun -sdk iphonesimulator clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp
    
    xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main- arm64.cpp (真机)
    

    cpp文件

    • 通过观察发现是方法sel的一种简式表达,但是具体是代表什么呢?

    Type Encodings

    • 这是在appleDevelop官网上找到的。
    • 除了这种方式还可以通过@encode(##),内建函数来获取各个类型的Encodings。

    具体意义

    • 方法会自带两个参数:self、方法名(cmd);

    • 例一

    -(void)say1{}   //oc
    
    {(struct objc_selector *)"say1", "v16@0:8", (void *)_I_HRTest_say1} //cpp
    

    v:返回值为空
    16:共占用16字节内存空间
    @:代表第一个参数self(每一个方法都会有一个默认参数self)
    0:第一个参数从第0号位置开始
    : :方法的Sel(方法名)
    8:SEL从第8号位置开始


    • 例二,系统生成的get方法
    {(struct objc_selector *)"name", "@16@0:8", (void *)_I_HRTest_name} //cpp
    

    第一个@:返回值为id类型
    16:共占用16字节内存空间
    第二个@:代表第一个参数self(每一个方法都会有一个默认参数self)
    0:第一个参数从第0号位置开始
    : :方法的Sel(方法名)
    8:SEL从第8号位置开始


    • 例三,系统生成的set方法
    {(struct objc_selector *)"setAge:", "v20@0:8i16", (void *)_I_HRTest_setAge_} //cpp
    

    v:返回值为空
    20:共占用20字节内存空间
    @:代表第一个参数是id类型-self(每一个方法都会有一个默认参数self)
    0:第一个参数从第0号位置开始
    : :方法的Sel(方法名)
    8:SEL从第8号位置开始
    i:第二个参数是int类型,代表传入参数
    16:第二个参数从16号位置开始-20号位置,共占4个字节

    相关文章

      网友评论

        本文标题:OC底层探索14-方法名Type Encodings

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