zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

李洪强iOS开发之OC[014] -对象的存储细节

ios存储对象开发 细节 OC 李洪强 014
2023-09-27 14:28:40 时间

 

 

//

//  main.m

//  13 - 对象的存储细节

//

//  Created by vic fan on 16/7/9.

//  Copyright © 2016 李洪强. All rights reserved.

//

 

#import <Foundation/Foundation.h>

 

 问题 1 :

 

    [person new]

 做了哪三件事情

 1 申请了内存空间

 2 初始化类中的实例变量

 3 返回对象的内存地址

 

    问题 2 :

 [person new] 创建的对象在内存的哪个区?

    堆区

 

    问题 3: 实例变量存储在内存的哪个区

    实例变量存储在内存的堆区      指针p存储在栈区

    问题 4  [p run] 是怎么调用的?

    先去找堆区的对象,再去找isa指针,有了isa指针,才能找到

    代码区的类(Person),找类中所存贮的方法.

 

 

 

    isa 指针是对象中的隐藏指针,指向创建这个对象的类

    --------------------------------

 分析:

 Person *p = [Person new];

 等号左边

 Person   程序会在3代码区开闭一块内存

 定义一个指针: 在栈区(P指针是局部变量)

 

 等号右边

 1 在堆区申请内存空间

 2  初始化实例变量

 

 

    1栈区          2堆区  ----->    3代码区  内存地址: ox111

                                    person类中的所有代码

    P指针           isa指针          实例变量:

                   _name = null    _name;

                    _age = 0       _age;

                                    方法:

                                    _run{

 

                                    }

                                    并没有开辟内存

 

 

 

 

    发送一个消息就是调用方法

    底层是C语言的,在调用一个函数 obj_msgsend

    一个类可以创建多个对象,但是每个对象的地址不是相同的

 

 

 

 

 */

 

@interface Person : NSObject{

@public

    //定义实例变量

    NSString *_name;//姓名

    int _age;//年龄

}

//方法的声明;

- (void)run;//人跑的方法的声明

@end

 

//类的实现

@implementation Person

//方法的实现

- (void)run{

    

    NSLog(@"周杰伦的床边故事");

}

 

@end

 

 

int main(int argc, const char * argv[]) {

    @autoreleasepool {

   

        Person *p = [Person new];

        p->_age = 12;

        p->_name = @"李洪强";

        

        //调用方法

        [p run];

        

    }

    return 0;

}