02-iOS底层学习 | OC本质

95 阅读1分钟
一. 概述
  • 在Objective-C中,所有类都是继承与NSObject
二. 底层代码
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp 

通过上面命令行可以输出cpp文件

  • NSObject的底层是一个结构体类型,内部有一个Class类型的成员isa
struct NSObject_IMPL {
     Class isa; 
};
  • 在NSObject.h文件中可以看到内部只有一个Class类型的isa成员,剩下都是方法
@interface NSObject <NSObject> {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-interface-ivars"
    Class isa  OBJC_ISA_AVAILABILITY;
#pragma clang diagnostic pop
}
OC对象的本质
  • 在Objective-C的对象都是基于C/C++的结构体实现的
  • 继承与Objective-C的对象,都会自带一个类型为Class的isa的成员变量
  • Objective-C本质上是一个NSObject_IMPL的结构体
  • 其成员变量isa本质上是一个指向objc_class结构体的指针

本质.png

三.内存布局
NSObject *object = [[NSObject alloc] init];
  • 获取实际占用内存大小
#import <objc/runtime.h>
class_getInstanceSize([NSObject class]) // 8
  • 系统实际分配内存大小
#import <malloc/malloc.h>
malloc_size((__bridge const void *)(car)) // 16
  • 获取类型所需内存大小
sizeof(int) // 4
sizeof(NSUInteger) // 8
  • 例子
@interface Car : NSObject

@property(nonatomic,assign)int year; // 年限
@property(nonatomic,assign)NSInteger kilometres; //公里数

@end

@interface BMW : Car

@property(nonatomic,assign)NSInteger oil;

@end
Car *car = [[Car alloc] init];
malloc_size((__bridge const void *)(car)) // 32
class_getInstanceSize([car class]) // 24
    
BMW *bmw = [[BMW alloc] init];'
class_getInstanceSize([bmw class]) // 32
malloc_size((__bridge const void *)(bmw)) // 32