OC对象创建过程

#import <Foundation/Foundation.h>

@interface Person : NSObject{
@public
    // 属性
    int _age;
    double _height;
    double _weight;
}
// 行为
- (void)eat:(char *)food;
- (void)sleep;
- (void)walk;
+ (void)show;
@end
@implementation Person
- (void)eat:(char *)food {
    NSLog(@"eat:%s", food);
}

- (void)sleep {
    NSLog(@"sleep");
}

- (void)walk {
    NSLog(@"walk");
}

+ (void)show {
    NSLog(@"I'm coming!!!");
}
@end

int main(int argc, const char * argv[]) {  
    //对象创建过程:
    //1.将代码读取到内存中的代码区(二进制)
    //2.在堆中由系统自动创建该类的类对象,类对象中包含这个类所有的方法
    //3.然后在堆中创建该类的实例对象,实例对象中包含这个类的所有属性,还有isa指针(这个指针指向类对象Class)  alloc,init.因为没有重写init方法,所以所有属性设为默认值.
    //4.返回实例对象的地址给栈中的引用 person
    Person *person = [Person new];

    //通过person引用给_age赋值
    person->_age = 30;
    person->_height = 1.75;
    person->_weight = 65.0;
    NSLog(@"age=%d, height=%f, weight=%f", person->_age, person->_height, person->_weight);

    //通过person引用找到类实例,然后通过类实例的isa指针找到类对象,在类对象中找到eat方法进行调用.
    [person eat:"milk"];
    //通过Person类调用,会直接到堆中去找Person类的类对象,然后进行调用.
    [Person show];

    struct Person {
        char *name;
        int age;
    };
    struct Person sp;
    NSLog(@"&sp = %p",&sp); //内存地址:0x7fff5fbff7d8
    NSLog(@"&sp.age=%p",&sp.name);//内存地址:0x7fff5fbff7d8
    //以上一个声明构造并实例化构造可以看出:结构体实例地址就是第0个属性的地址

    //对象的本质就是结构体,所以person的地址也是第0个属性的地址,但是这个属性不是_age,而是isa
    NSLog(@"person = %p", person);//内存地址:0x100200420
    NSLog(@"&person.age = %p",&(person->_age));//内存地址:0x100200428
    //由上面可以看出在_age之前还有一个属性,那就是isa.

    //每次new都会分配内存空间创建一个新的对象.这两个对象指向同一个类对象.
    Person *person2 = [Person new];
    return 0;
}

--EOF--