• iOS进阶一OC对象的本质


    OC对象的本质

    平时编写的Object-C代码,底层实现其实都是C/C++代码。 

    所以Objective-C的面向对象都是基于C/C++的数据结构实现的,OC对象内部可以容纳不同数据类型的数据,因此可以推断OC对象的底层数据结构就是结构体

    为了进一步研究OC对象的本质,我们使用苹果Xcode内置的LLVM编译器前端clang中-rewrite-objc 将我们的OC代码转为C/C++实现。

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

     由于不同平台支持的代码肯定是不一样的,目前我们关注点是iOS开发,建议在将OC代码转成C/C++代码指定平台

    xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main.cpp

     通过生成的C/C++代码,我们编写的OC对象NSObject的底层实现为:

    typedef struct objc_class *Class;
    // NSObject的底层实现
    struct NSObject_IMPL {
        Class isa;
    };

    NSObject在内存中布局就是一个指向struct objc_class类型结构体的指针isa。由于内部就一个成员,那么isa的地址就是NSObject结构体在内容中的地址

    获取对象实例在内存中内存空间大小

    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            NSObject *obj = [[NSObject alloc] init];
            // 获得NSObject类的实例对象的成员变量所占用的大小:8
            size_t size1 = class_getInstanceSize([NSObject class]);
            
            // 获取一个指针所指向内存空间的大小:16
            size_t size2 =  malloc_size((__bridge const void *)(obj));
            
            NSLog(@"%zu, %zu", size1, size2); 
        }
        return 0;
    }

    class_getInstanceSize函数可以在runtime源码中查看,获取的是类的成员变量占用的内存大小。

     

  • 相关阅读:
    作为一个非计算机专业的人,你们是怎样进入IT行业的?
    第一次写博客
    变卖
    近2周关于Shadowing的总结
    二十九岁步入而立之年的思考
    最美的回忆漫天的雪
    有趣的房东夫妇
    遥远的思恋—我的儿子
    五年一轮回
    写在开工之前我的2010
  • 原文地址:https://www.cnblogs.com/CoderHong/p/10887858.html
Copyright © 2020-2023  润新知