OC对象的本质

Posted coderhong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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源码中查看,获取的是类的成员变量占用的内存大小。

 技术图片

 

以上是关于OC对象的本质的主要内容,如果未能解决你的问题,请参考以下文章

iOS-Objective-C的本质

OC基础--Objective-C本质

iOS底层原理 - Block本质探究

IOS开发-OC学习-常用功能代码片段整理

iOS开发系列-Block本质篇

OC中对象的复制:二