美文网首页
iOS 类本质

iOS 类本质

作者: 小暖风 | 来源:发表于2020-12-27 12:15 被阅读0次

    Objective-C代码,底层实现其实都是C\C++代码。

    使用基本代码验证对象是什么:

    oc代码:

    int main(int argc, const char * argv[]) {

    @autoreleasepool {

        // insert code here...

    NSObject *obj=[[NSObject alloc]init];

        NSLog(@"Hello, World!");

    }

    return 0;

    }

    编译后的代码:

    int main(int argc, const char * argv[]) {

    /* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool;

      NSObject *obj=((NSObject *(*)(id, SEL))(void *)objc_msgSend)((id)((NSObject *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("NSObject"), sel_registerName("alloc")), sel_registerName("init"));

        NSLog((NSString *)&__NSConstantStringImpl__var_folders_c0_7nm4_r7s4xd0mbs67ljb_b8m0000gn_T_main_1b47c1_mi_0);

    }

    return 0;

    }

    其实我们Object-C编译之后对象会编译成结构体

    struct NSObject_IMPL {

    Class isa;

    };

    1

    那么isa是什么吗?

    typedef struct objc_class *Class;

    class其实是一个指向结构体的指针,然后com+点击class得到:

    struct objc_class {

        Class _Nonnull isa  OBJC_ISA_AVAILABILITY;

    #if !__OBJC2__

        Class _Nullable super_class                              OBJC2_UNAVAILABLE;

        const char * _Nonnull name                              OBJC2_UNAVAILABLE;

        long version                                            OBJC2_UNAVAILABLE;

        long info                                                OBJC2_UNAVAILABLE;

        long instance_size                                      OBJC2_UNAVAILABLE;

        struct objc_ivar_list * _Nullable ivars                  OBJC2_UNAVAILABLE;

        struct objc_method_list * _Nullable * _Nullable methodLists                    OBJC2_UNAVAILABLE;

        struct objc_cache * _Nonnull cache                      OBJC2_UNAVAILABLE;

        struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE;

    #endif

    } OBJC2_UNAVAILABLE;

    class是一个指针,那么占用多少内存呢?大家都知道指针在32位是4字节,在64位是8字节。

    NSObject *obj=[[NSObject alloc]init];

    可以理解成实例对象是一个指针,指针占用8或者4字节,那么暂时假设机器是64位,记为对象占用8字节。 obj就是指向结构体class的一个指针。 那么我们来验证一下:

    int main(int argc, const char * argv[]) {

    @autoreleasepool {

        // insert code here...

    NSObject *obj=[[NSObject alloc]init];

    //获得NSobject对象实例大小

    size_t size = class_getInstanceSize(obj.class);

    //获取NSObjet指针的指向的内存大小

    //需要导入:#import <malloc/malloc.h>

    size_t size2 = malloc_size((__bridge const void *)(obj));

    NSLog(@"size:%zu size2:%zu",size,size2);

    }

    return 0;

    }

    得出结果是:

    size:8 size2:16

    结论是:指针是8字节,指针指向的的内存大小为16字节。 查看源码得知[[NSObject alloc]init]的函数运行顺序是:

    类的本质:结构体

    类的结构:isa,superclass,cache,bits

    类的属性方法:

    相关文章

      网友评论

          本文标题:iOS 类本质

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