• 05-OC对象的内存分析


    首先,完整的代码如下:

     1 //1.类的声明
     2 #import <Foundation/Foundation.h>
     3 @interface Person : NSObject
     4 {
     5 @public
     6     int _age;//年龄
     7     double _weight;//体重
     8 }
     9 - (void)run;//
    10 - (void)eat;//
    11 @end
    12 
    13 
    14 //2.类的实现
    15 @implementation Person
    16 //实现@interface中声明的方法
    17 - (void)run
    18 {
    19     NSLog(@"%d岁,%.1fkg的在跑", _age, _weight);
    20 }
    21 
    22 - (void)eat
    23 {
    24     NSLog(@"%d岁,%.1fkg的人在吃", _age, _weight);
    25 }
    26 
    27 @end
    28 
    29 
    30 int main(int argc, const char * argv[])
    31 {
    32 
    33     Person *person1 = [Person new];
    34     person1 -> _age = 20;
    35     person1 -> _weight = 50.0;
    36     [person1 run];
    37     [person1 eat];
    38     
    39     Person *person2 = [Person new];
    40     person2 -> _age = 30;
    41     person2 -> _weight = 60.0;
    42     [person2 run];
    43     [person2 eat];
    44 }

    为了分析方便,我们把main函数的部分单独取出来,如下:

     1 int main(int argc, const char * argv[])
     2 {
     3 
     4     Person *person1 = [Person new];
     5     person1 -> _age = 20;
     6     person1 -> _weight = 50.0;
     7     [person1 run];
     8     [person1 eat];
     9     
    10     Person *person2 = [Person new];
    11     person2 -> _age = 30;
    12     person2 -> _weight = 60.0;
    13     [person2 run];
    14     [person2 eat];
    15 }

    为了更好理解,画张图:

    分析:

    (1)执行第4行代码的时候,实际上包含了3步操作:

      1>在内存中开辟空间:为新创建的Person类对象1,开辟一块存储空间,如图;

      2>初始化成员变量:默认初始化为0

      3>返回空间地址:创建一个指针变量person1,并将对象1的地址赋值给person1,所以person1 = ffc0,如图。

    (2)同(1)第10行代码执行完毕后:在内存中开辟了另一块空间,存放新建的Person类对象2,并把对象2的地址赋值给指针变量person2,这时person2 = ffc1,如图。

    (3)在使用类创建对象之前,会将类加载进内存(只会加载1次),并且类中声明的方法列表都保存在类中。

    (4)每个对象内部,默认有一个isa指针,isa指针指向的就是当前对象所对应的类。

    (5)成员变量是每个对象都有的,方法列表只有1份,是所有对象共同使用的。

    (6)成员变量赋值:当执行person1 -> _age = 20;的时候,person1会访问它所指向的对象,并将20赋值给_age;

    (7)调用方法的本质:当执行[person1 run]的时候,会给person1所指向的对象发送一条run消息,这时对象1会通过isa指针找到类,在类中的方法列表中找到run方法并调用,一调用run方法,就会来到run方法所对应的代码区,执行run方法的代码。

      

    人生之路,不忘初心,勿忘始终!
  • 相关阅读:
    改进神经网络及深度学习的学习方法
    caffe+win7+vs2013 仅CPU环境安装
    读书笔记--C陷阱与缺陷(七)
    读书笔记--C陷阱与缺陷(六)
    读书笔记--C陷阱与缺陷(五)
    读书笔记--C陷阱与缺陷(四)
    读书笔记--C陷阱与缺陷(三)
    搭建centos7的开发环境3-Spark安装配置
    Spark学习笔记
    Python2和Python3比较分析
  • 原文地址:https://www.cnblogs.com/xdl745464047/p/3996265.html
Copyright © 2020-2023  润新知