iOS类与对象

作者: iOS小洁 | 来源:发表于2022-03-07 22:47 被阅读0次

    创建一个对象的过程

    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类与对象

        本文链接:https://www.haomeiwen.com/subject/sdjorrtx.html