A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 非良人 中级黑马   /  2016-3-16 20:23  /  585 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1. 内存中的五大区域.

    栈: 存储局部变量.
    堆: 允许程序员手动在堆区申请指定的连续的字节数的空间来使用.
    BSS段: 存储未初始化的全局变量、静态变量.
    数据段(常量区):  存储已经初始化的全局变量、静态变量、常量数据.
    代码段:存储程序的代码.

2. 类加载.

    1). 当我们创建对象的时候,肯定需要访问这个类.因为只有访问了类才知道类中有那些成员.

    2). 如果只是声明类指针的时候,也会访问这个类.以确定这个类型是否存在.

   
    当类第一次被访问的时候,会将类存储到代码段之中. 这个过程叫做类加载.
    将类的代码存储在代码之中.
    将类的代码以字符串的形式存储在代码段中.

    只有类第1次被访问的时候,才会有类加载.   
    一旦类被加载到代码区.直到程序结束的时候才会被回收.


3.对象在内存中是如何存储的.

   1). 类的本质是:我们自定义的数据类型.

       HMPerson *p1 = [HMPerson new];
   
   2). HMPerson *p1;
       这句话,仅仅是声明了1个指针变量而已.这个指针变量的类型是HMPerson*.

       p1是1个局部的变量.所以p1指针变量是存储在栈区的.
       p1是1个指针变量,所以这个变量中只能存储地址.
       本质上来讲.p1是1个指针变量 不是1个对象.

    3).[HMPerson new];
       这句话,才是在真正的创建对象.
       new做的事情.
       a. 在堆内存中申请一块合适大小的空间.
       b. 在申请的这块空间中根据类的模板创建对象.
          类中有哪些属性.就把类的属性依次的挨个的一个不落的声明在这个对象中.
          对象中除了有类中定义的属性之外,还有1个属性叫做isa 这是1个指针.
          这个isa指针指向代码段中的类.
       c. 初始化对象的属性.为对象的属性赋默认值
          -> 如果属性的类型是基本数据类型.就赋值为0
          -> 如果属性的类型是C指针类型.就赋值为NULL
          -> 如果属性的类型是OC指针类型.就赋值为nil
       d. 返回这个对象在堆空间中的地址.
          将这个地址赋值给p1指针.
          p1指针指向了堆空间中的HMPerson对象.


    4). 注意
        a. 对象中只有类的属性+isa的指针. 没有方法.
           isa指针指向了代码段中的类.

        b. 如何访问对象的属性.
           通过指针就可以找到指针指向的对象.找到对象了,就可以找到对象的属性.
          p1->_name = @"jack";

        c. 如何调用对象的方法?
           [p1 sayHi];
           通过p1指针找到对象,发现是在调用方法.那么再根据对象的isa指针找到代码段中的类.
           再找到类中的对应的方法来执行.

        d. 为什么方法不保存在对象中.
           因为不管对象有多少个.方法的代码都是一样的.没有必要保存多份,只保存1份就可以了.

        e. 相同类的对象的isa指针的值一定都是一样的.



4. 对象的属性的初始值.

    我们创建1个对象 如果没有为这个对象的属性赋值.那么这个对象的属性是有值的.
    属性的类型是基本数据类型:  0
              OC指针:      nil
              C指针:       NULL
         





0 个回复

您需要登录后才可以回帖 登录 | 加入黑马