iOS类与对象

创建一个对象的过程

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

alloc流程图

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

isa流程图

结构体、联合体(共用体)

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;

你可能感兴趣的:(iOS类与对象)