OC

作者: 我的昵称在不在 | 来源:发表于2018-03-14 20:16 被阅读0次

1.oc底层其实都是c/c++代码

oc的类主要是基于c/c++的结构体实现的

clang -rewrite-objc main.m -o main.cpp转成c++文件
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main.cpp转成c++文件(指定生成的c++文件架构)

<mark>不管char, int, float*,所有类型的指针变量在32位系统上都是4字节, 64位系统上都是8字节。<mark>

一个NSObject对象本质是一个只有一个isa指针变量的结构体,所以一个NSObject对象只占一个指针变量所占的字节(32位是4个,64位是8个)。
ps:64位,NSObject对象实际分配了16个字节,但是真正占用的就只有8个字节。

结构体的isa指针地址,就是这个对象的地址
class_getInstanceSize([NSObject class])可以获取一个类所创建出来的对象占用的内存大小

4.实时查看内存

lldb memory read [对象地址]
memory write [对象地址] 改地址

5.内存对齐(个人理解:按最长的,不够的补上)

struct NSObject_IMPL {
    Class isa;
};

struct Person_IMPL {
    Class isa; // 8个字节
    int _age; // 4个字节
}; // 内存对齐:16个字节

struct Student_IMPL {
    Class isa;// 8个字节
    int _age;//4个字节
    int _no; // 4个字节
}; // 内存对齐:16个字节


/* Person */
@interface Person : NSObject
{
    int _age;
}
@end

@implementation Person
@end

/* Student */
@interface Student : Person
{
    int _no;
}
@end

@implementation Student
@end

6.oc对象的分类

  • instance对象(实例对象)

    • 有isa指针
  • class对象(类对象)每个类只有一个class对象,一份内存

    • 有isa指针
    • superclass指针
    • 类的属性信息(@property)、类的对象方法信息
    • 类的协议信息、类的成员变量信息
    • 等等

    (注意:这些属性,成员变量的值在实例对象中存放)

  • meta-class对象(元类对象)每个类只有一个meta-class对象,一份内存

    • isa指针
    • superclass指针
    • 类方法信息
    • 等等

7.isa指针(从64位开始,实例对象isa&[一个固定的值]得到类对象,类对象到元类对象同理)

  • instance对象 isa指向class对象
    调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用
  • class对象isa指向meta-class对象
    调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用

8.superclass指针

指向父对象


09AAB45F-90D2-4ECE-AE3C-026532E51322.png isasuperclass.png

9.练习

这个方法能调用成功。
MJPerson类对象的isa指针指向MJPerson元类没找到test方法,然后找NSObject元类,也没有test方法,然后去NSObject类对象找,有test方法,调用。
虽然是减号方法,其实内部调用都是通过message给对象发送消息,不涉及到减号加号方法。


253AC9F9-A2CD-445D-AA1A-46E32BFE3274.png 8832A95B-0124-431E-900E-58CFAE2E86BE.png C9113723-8F1E-42A4-8FCC-376F811D2C0E.png

相关文章

网友评论

      本文标题:OC

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