OC 对象的内存存储细节(类方法及对象方法的调用细节)

来源:互联网 发布:shadow web 黑暗网络 编辑:程序博客网 时间:2024/04/30 21:36

//

//  main.m

//  第二个OC


#import <Foundation/Foundation.h>


/*

 定义一个类:person

 属性:age heifht weight

 行为:eat sleep walk

 */


@interface Person : NSObject

{

    //属性

    @public

    int _age;

    double _height;

    double _weight;

}


//行为

-(void)eat:(char *)food;

-(void)sleep;

+(void)walk;

@end


@implementation Person


-(void)eat:(char *)food{

    NSLog(@"%s",food);

}

-(void)sleep{

    NSLog(@"开始睡觉");

}

+(void)walk{

    NSLog(@"开始散步");

}


@end

int main(int argc,constchar * argv[]) {

    //创建对象

    /*

     在堆中开辟存储空间,初始化属性

     在栈中返回指针地址,这个地址其实就是类的第0个属性的地址,但类的第0个属性,并不是_age,而是isa,是系统自动生成的

     isa属性其实就是存储的指针,占8字节

     

     其实类也是一个对象,也就意味person也是一个对象

     平时我们所说的创建对象就是通过一个类对象来创建一个新的实例对象

     类对象是系统自动帮我们创建的,里面包含了当前对象的所有方法

     而实例对象是程序自己手动通过new来创建的,而实例对象的第0个属性isa就是指向创建它的类对象

     

     类的方法在内存中只有一份存储空间,所有的对象公用类的方法

     */

    Person *p = [Personnew];

    //将堆中的存储空间里面的初始化的属性值修改

    p->_age = 30;

    p->_height = 172.5;

    p->_weight = 85.5;

    

    NSLog(@"p = %p",p);

    NSLog(@"age = %p",&(p->_age));

    

    /*

     调用对象方法的步骤:根据p指针找到实例对象在堆中的存储空间,通过实例对象找到isa指针,通过isa指针

     找到类对象的存储空间,然后找到sleep方法,调用sleep方法输出信息

     */

    [p sleep];

    

    /*

     调用类方法的步骤:直接内存中找类对象,并找到类对象的方法执行,所以类方法的执行效率比对象方法的执行效率高

     */

    [Personwalk];

    /*

     当第二次调用new方法的时候,会重复上面的步骤,

     此时在堆内存中存在两个实例变量,栈内存中存在两个指向实例对象的指针

     如果修改p2的属性,不会对p的属性有影响

     总结:一个类可以创建多个对象

     */

    Person *p2 = [Personnew];


    return 0;

}


0 0
原创粉丝点击