zoukankan      html  css  js  c++  java
  • 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方法的代码。

      

    人生之路,不忘初心,勿忘始终!
  • 相关阅读:
    LOJ 6089 小Y的背包计数问题 —— 前缀和优化DP
    洛谷 P1969 积木大赛 —— 水题
    洛谷 P1965 转圈游戏 —— 快速幂
    洛谷 P1970 花匠 —— DP
    洛谷 P1966 火柴排队 —— 思路
    51Nod 1450 闯关游戏 —— 期望DP
    洛谷 P2312 & bzoj 3751 解方程 —— 取模
    洛谷 P1351 联合权值 —— 树形DP
    NOIP2007 树网的核
    平面最近点对(加强版)
  • 原文地址:https://www.cnblogs.com/xdl745464047/p/3996265.html
Copyright © 2011-2022 走看看