创建一个对象的过程
Teacher *t = [[Teacher alloc]init];
对象占用大小,8字节对齐
系统开辟内存大小,16字节对齐
sizeof(person),
class_getInstanceSize([LGPerson class]), 对象需要的真正的内存 // malloc/malloc.h
malloc_size((__bridge const void *)(person)) //objc/runtime.h
alloc 流程分析
alloc
_objc_rootAlloc
callAlloc
_objc_rootAllocWithZone
_class_createInstanceFromZone
cls->instanceSize 计算内存大小(内存对齐)
calloc 开辟空间
obj->instanceIsa 关联到类
objc_msgSend
NSObject为什么不走源码流程
NSObject 调用alloc,直接找objc_alloc
其他类调用alloc , 先找objc_alloc,然后再找alloc
NSObject 根类
内存对齐
1、数据成员对⻬规则:每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小的整数倍开始
2、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.
3、结构体的总⼤⼩,也就是sizeof的结果,.必须是其内部最⼤成员的整数倍.不⾜的要补⻬
(x + (8-1)) & ~(8-1)
(x + (8-1)) >> 3 << 3
结构体内存
结构体指针大小 8
结构体大小 根据结构体内部数据计算
结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍.不足的要补⻬
ISA
union isa_t
{
Class cls;
uintptr_t bits;
struct {
uintptr_t nonpointer : 1;
uintptr_t has_assoc : 1;
uintptr_t has_cxx_dtor : 1;
uintptr_t shiftcls : 33;
uintptr_t magic : 6;
uintptr_t weakly_referenced : 1;
uintptr_t deallocating : 1;
uintptr_t has_sidetable_rc : 1;
uintptr_t extra_rc : 19;
}
}
magic 用于调试器判断当前对象是真的对象还是没有初始化的空间
Clang
Clang是一个C语言、C++、Objective-C语言的轻量级编译器
clang -rewrite-objc main.m -o main.cpp 把目标文件编译成c++文件
clang -rewrite-objc -fobjc-arc -fobjc-runtime=ios-13.0.0 -isysroot / Applications/Xcode.app/Contents/Developer/Platforms/ iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.0.sdk main.m
xcode
安装的时候顺带安装了xcrun
命令,xcrun
命令在clang
的基础上进行了 一些封装,要更好用一些
xcrun -sdk iphonesimulator clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp (模拟器)
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp (手机)
alloc init 与 new 区别
isa,superclass指向路线
实例对象isa --> 类对象isa --> 元类对象isa --> NSObject元类isa --> NSObject元类isa
superclass 指向
类对象 --> 父类类对象 --> ... --> NSObject --> nil
元类对象 --> 父类元类对象 --> ... --> NSObject元类对象 --> NSObject --> nil
结构体、联合体(共用体)
struct 所有变量是‘共存’的,优点是‘有容乃大’,全面; 缺点是struct内存空间的分配是粗放的,不管用不用,全分配。
联合体(union)中是各变量是“互斥”的——缺点就是不够“包容”; 但优点是内存使用更为精细灵活,也节省了内存空间
联合体
define LGDirectionFrontMask (1 << 0)
define LGDirectionBackMask (1 << 1)
define LGDirectionLeftMask (1 << 2)
define LGDirectionRightMask (1 << 3)
union {
char bits;
// 位域
struct {
char front : 1;
char back : 1;
char left : 1;
char right : 1;
};
} _direction;