一. 概述
- 在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结构体的指针
三.内存布局
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