1.内存中的五大区域
栈: 局部变量.
堆:堆区中的字节空间允许程序员手动的申请.
BSS段:未初始化的全局变量、静态变量.
数据段:已经初始化的全局变量、静态变量和常量数据.
代码段:存储代码的.
2.OC类在内存中的存储
类什么时候加载到代码段.
类第1次被访问的时候,类就会被加载到代码段存储类加载.
类一旦被加载到代码段之后什么时候回收.
是不会被回收的除非程序结束.
类是以Class对象的形式存储在代码段之中的.
1). 任何存储在内存中的数据都有1个数据类型.
任何在内存中申请的空间也有自己的类型.
Person *p1 = [Person new];
2). 在代码段中存储类的步骤
a. 先在代码段中创建1个Class对象, Class是Foundation框架中的1个类.
这个Class对象就是用来存储类信息的.
b. 将类的信息存储在这个Class对象之中.
这个Class对象.至少有3个属性
类名:存储的这个类的名称.
属性s:存储的这个类具有哪些属性
方法s:存储的这个类具有哪些方法.
所以.类是以Class对象的形式存储在代码段的.
存储类的这个Class对象我们也叫做类对象.用来存储类的1个对象.
所以,存储类的类对象也有1个叫做isa指针的属性这个指针指向存储父类的类对象.
3). 如何拿到存储在代码段中的类对象.
1). 调用类的类方法class就可以得到存储类的类对象的地址.
2). 调用对象的对象方法class就可以得到存储这个对象所属的类的Class对象的地址.
3). 对象中的isa指针的值其实就是代码段中存储类的类对象的地址.
注意:
声明Class指针的时候不需要加*因为在typedef的时候已经加了*了.
4). 如何使用类对象.
1).拿到存储类的类对象以后.
Class c1 = [Person class];
c1对象就是Person类.
c1 完全等价于 Person
2). 使用类对象来调用类的类方法.
因为类对象就代表存储在这个类对象中类.
Class c1 = [Person class];
c1就代表Person类.
所以在使用Person的地方完全可以使用c1代替.
比如我们使用类名来调用类方法.
[Person sayHi];
完全可以使用c1来调用.因为c1就是Person
[c1 sayHi];
3). 可以使用类对象来调用new方法创建存储在类对象中的类的对象.
Person *p1 = [Person new];
Class c1 = [Person class];
其实创建Person对象也可以这么做.
Person *p2 = [c1 new];
4).注意:
使用类对象只能调用类的类方法,因为类对象就等价于存在其中的类.
Class c1 = [Person class];
c1就是Person。