美文网首页
OC instance 对象本质二

OC instance 对象本质二

作者: 曹来东 | 来源:发表于2018-08-11 17:06 被阅读8次
image.png
执行如下指令,生成.cpp文件
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp

检索Student_IMPL {查看Student结构体实现如下:

struct Student_IMPL {
    struct NSObject_IMPL NSObject_IVARS;
    int _no;
    int _age;
};

struct NSObject_IMPL NSObject_IVARSNSObject的底层实现,即NSObject_IMPL:

struct NSObject_IMPL {
    Class isa
};

所以继承自NSObjectStudent的实现相当于:

struct Student_IMPL {
    Class isa;
    int _no;
    int _age;
};

如上所示,一个子类会将自父类继承来的成员变量放在成员变量列表的起始位置,先排列父类的成员变量,然后再排列自己的成员变量.

Student对象的内存分配如下:

image.png

obj指针的地址为:Student对象的第一个成员变量的地址:isa的地址.

image.png
image.png
通过上面两幅图可以证明:Student底层本质就是Student_IMPL结构体.

Student对象 结构图:

image.png

思考:

image.png

内存对其:

  • 结构体内存大小 必须为 该结构体最大成员变量占用内存的整数倍.Person结构体的最大内存成员变量为Struct NSObject_IMPL Person_IVARS8个字节.所以为16个字节.
    image.png
image.png

代码打印:

image.png

为什么Person对象分配的内存和实际占用的内存都为16?

Person 底层实现:

struct NSObject_IMPL {
    Class isa;
}

struct Person_IMPL {
    struct NSObject_IMPL NSObject_IVARS;
    int _no;
}

@interface Person : NSObject
{
    int _no;
}
image.png
Person对象正常应该占用12个字节.因为内存对其原则:
结构体大小 需为 结构体最大成员变量(struct NSObject_IMPL)所占内存的整数倍所以Person的占用的内存大小为 8 * 2 = 16.
从如下函数中也可看出class_getInstanceSize底层调用的是如下函数:
 uint32_t alignedInstanceStart() {
        return word_align(unalignedInstanceStart());
    }

unalignedInstanceStart()该函数为未做内存对其的内存大小//12
word_align(12)该函数对其后的内存大小//16

instance对象中只有 成员变量,没有方法列表.方法列表在Class对象当中.

@interface Person : NSObject
{
    int _no;
}
@property (nonatomic,assign) int height;
@end

Person instance对象的底层实现:

struct Person_IMPL {
    struct NSObject_IMPL NSObject_IVARS;
    int _no;
    int _height;
};

可以看到实现中没有heightgettersetter方法.

设计技巧:

  • Person 类的不同instance 对象的成员变量(_no,_height)的值会不同.所以在不同instance对象的实现中记录不同instance的成员变量的值.
  • 但是Person 实例的方法都是相同的,只需要一份就够了,所以方法列表不在instance对象中,而在Class对象的方法列表中,Class对象 在内存中只存在一份.

相关文章

  • OC instance 对象本质二

    检索Student_IMPL {查看Student结构体实现如下: struct NSObject_IMPL NS...

  • OC instance 对象本质一

    一个OC对象占用多少内存 解答: 系统分配了16个字节给NSObject对象可通过malloc_size函数获得 ...

  • OC instance 对象本质三

    LDPerson底层实现: 所以上图中LDPerson的instance对象占用16字节的内存. 思考下图中LDP...

  • Object-C对象本质

    Object-C对象本质 OC中对象类型 instance 实例对象isa指针其他成员变量 class 类对象is...

  • OC对象的分类

    OC中的对象,简称OC对象,主要可以分为3种: instance对象(实例对象) instance对象就是通过类a...

  • oc对象的种类

    oc对象:instance对象,class对象,meta-class 对象 instance对象 isa 其他成员...

  • iOS-浅谈OC中对象的类型

    目录 OC对象的类型Instance对象(实例对象)----实例(instance)对象内存结构Class对象(类...

  • OC对象的分类

    OC对象的分类 - instance对象(实例对象) instance对象就是通过类alloc出来的对象,每次调用...

  • Runtime基础类型介绍

    Class:类Instance:实例 OC中的对象的实例本质上是 OC中的类本质上是 isa_t的结构是 这是一个...

  • OC对象的分类

    01-instance对象 Objective-C中的对象,简称OC对象,主要可以分为3种 instance对象(...

网友评论

      本文标题:OC instance 对象本质二

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