#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;
}
本文原链接:OC中对象创建过程
--EOF--
网友评论