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

    格物致知iOS类与对象 格物致知iOS类与对象

  • iOS类与对象

    创建一个对象的过程 Teacher *t = [[Teacher alloc]init]; 对象占用大小,8字节对...

  • Effective Objective-C 2.0 第二章 14

    我之前这篇文章iOS runtime 类与对象已经详细介绍过类与对象,本篇重点介绍书中内容。 Objective-...

  • oc对象实现图解

    ios第一篇(oc对象) ios类对象和元类对象以及对象的关系 类对象中存储的是对象的实例方法,属性,成员变量,协...

  • Runtime源码剖析---图解对象、类与isa

    Runtime源码剖析---图解对象、类与isa 源码面前,了无秘密 在iOS开发的过程中,对象、类应该是我们接触...

  • IOS的类与对象

    IOS中的类:就是一个具有同一属性的事物,比如人,都有年龄,身高,等等 IOS中的对象:目前了解就是由类衍生出得属...

  • iOS - Runtime 类与对象

    转自南峰子前辈的文章:点击这里 一、Runtime库所做的事情: 封装:对象可以用 C 语言中的结构体表示,方法用...

  • iOS runtime 类与对象

    Objective-C runtime 是一个运行时库,它提供支持 Objective-C 语言的动态属性,其优势...

  • iOS开发runtime原理与实践: 消息转发篇(Message

    iOS开发runtime原理与实践: 消息转发篇(Message Forwarding) (类,对象,方法,消息传...

  • iOS内存分配

    iOS对象有3种: 实例对象 类对象 元类对象 对象(对象都是结构体)的内存中,包含的指针: isa 实例对象is...

网友评论

    本文标题:iOS类与对象

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