底层原理笔记:
1.oc中类的本质是c++中的结构体
2.clang -rewrite-objc main.m -o main.cpp 重写文件 -o输出 main.cpp新文件名字
模拟器(i386),32bit(armv7),64bit(arm64)
xrun -sdk iphoneos clang arm64 -rewrite-objc main.m -o main-arm64.cpp
3.NSObject *obj = [[NSObject alloc] init];
NSObject在内存中如下:
struct NSObject_IMPL {
Class isa; // 8个字节//isa是指向类对象的指针变量
};
结构体的地址就是第一个成员变量的地址;
// 获得NSObject实例对象的成员变量所占用的大小 >> 8
NSLog(@"%zd", class_getInstanceSize([NSObject class]));
// 获得obj指针所指向内存的大小 >> 16
NSLog(@"%zd", malloc_size((__bridge const void *)obj));
说明:NSObject实际上分配16个字节,但是只用了8个字节(isa变量只占用了8个字节,使用class_getInstanceSize可以查看)
oc对象最少要分配16个字节,objc4源码中有讲解
size_t class_getInstanceSize(Class cls)
{
if (!cls) return 0;
return cls->alignedInstanceSize();
}
size_t instanceSize(size_t extraBytes) {
size_t size = alignedInstanceSize() + extraBytes;
// CF requires all objects be at least 16 bytes.
if (size < 16) size = 16;
return size;
}
计算机大端小端模式:mac采用的是小端模式:从高位到低位读取数据;
大端是从低位开始读取;
内存对齐:结构体的内存大小必须是最大成员大小的倍数;
系统内存也有对其规则;
属性生成的setter,getter方法不在实例对象结构体的内存中,因为实例对象可能会有多个,所以方法只需要一份就好了,其他实例对象公用一个方法;
person->age;访问的是person对象的age属性;
person.age;访问的是age的setter方法或者是getter方法;
方法放在类对象的方法列表中;