zoukankan      html  css  js  c++  java
  • 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源码中查看,获取的是类的成员变量占用的内存大小。

     

  • 相关阅读:
    SpringBoot实现原理
    常见Http状态码大全
    forward(转发)和redirect(重定向)有什么区别
    1094. Car Pooling (M)
    0980. Unique Paths III (H)
    1291. Sequential Digits (M)
    0121. Best Time to Buy and Sell Stock (E)
    1041. Robot Bounded In Circle (M)
    0421. Maximum XOR of Two Numbers in an Array (M)
    0216. Combination Sum III (M)
  • 原文地址:https://www.cnblogs.com/CoderHong/p/10887858.html
Copyright © 2011-2022 走看看