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指针
指向父对象
![](https://img.haomeiwen.com/i6415149/881122e0fa93fbf1.png)
![](https://img.haomeiwen.com/i6415149/3f17a6a97bc01035.png)
9.练习
这个方法能调用成功。
MJPerson类对象的isa指针指向MJPerson元类没找到test方法,然后找NSObject元类,也没有test方法,然后去NSObject类对象找,有test方法,调用。
虽然是减号方法,其实内部调用都是通过message给对象发送消息,不涉及到减号加号方法。
![](https://img.haomeiwen.com/i6415149/2adc72ed92f39354.png)
![](https://img.haomeiwen.com/i6415149/159a371301bbfab7.png)
![](https://img.haomeiwen.com/i6415149/4a93bf10ce80d055.png)
网友评论