OC基础-类对象在内存中的存储方式13

来源:互联网 发布:淘宝退货地址哪里设置 编辑:程序博客网 时间:2024/06/05 02:21

1.内存中的五大区域

   

    : 局部变量.

    :堆区中的字节空间允许程序员手动的申请.

    BSS:未初始化的全局变量、静态变量.

    数据段:已经初始化的全局变量、静态变量和常量数据.

    代码段:存储代码的

    内存五大区域链接


2.OC类在内存中的存储

  

   类什么时候加载到代码段.

    类第1次被访问的时候,类就会被加载到代码段存储类加载.


    类一旦被加载到代码段之后什么时候回收.

    是不会被回收的除非程序结束.


    类是以Class对象的形式存储在代码段之中的.


    1). 任何存储在内存中的数据都有1个数据类型.


        任何在内存中申请的空间也有自己的类型.

        Person *p1 = [Person new];


    2).  在代码段中存储类的步骤


        a. 先在代码段中创建1Class对象, ClassFoundation框架中的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






原创粉丝点击