虚线是isa的指向,实线是继承关系。
// // main.m // 类的本质 #import <Foundation/Foundation.h> #import "Person.h" #import "Car.h" void demo(Class c); int main(int argc, const char * argv[]) { /* 类其实也是一个对象, 这个类对象会在这个类第一次被使用的时候创建。 只要有了类对象, 将来就可以通过类对象来创建实例对象。 实例对象中有一个isa指针, 指向创建自己的类对象。 类对象中保存了当前对象所有的"对象方法"。 当给一个实例对象发送消息的时候, 会根据实例对象中的isa指针去对应的类对象中查找。 */ Person *p = [[Person alloc] init]; //Person的代码存在代码区(程序一启动就有了,还没有用它)。用到Person的时候就会根据代码区的代码在"堆"中创建一个Person类对象(有属性和对象方法列表,也有一个isa指针,指向Person的元类对象。元类对象里面存的是类方法,元类对象也有isa指针。指向根元类对象,有new方法isa指针,指向自己,就是NSObject)。alloc的时候会创建一个在"堆"中的实例对象,并且有一个isa指针指向类对象(属性赋值为0)。init的时候返回地址给"栈"的变量。 [p setAge:30]; [Person test]; // 1.如何获取类对象 // [实例对象 class]; [类名 class]; Person *p1 = [[Person alloc] init]; Person *p2 = [[Person alloc] init]; // 一个类再内存中只有一份类对象,是Class类型。 Class c1 = [p1 class]; //*不要 Class c2 = [p2 class]; Class c3 = [Person class]; NSLog(@"c1 = %p, c2 = %p, c3 = %p", c1, c2, c3);//c1 = 0x100004790, c2 = 0x100004790, c3 = 0x100004790 // 2.类对象的应用场景 // 2.1用于创建实例对象 Person *p3 = [[c1 alloc] init]; p3.age = 30; NSLog(@"%i", p3.age); // 2.2用于调用类方法,类对象可以调用类方法。 [Person test]; [c1 test]; //2.3 作为函数参数 demo(c1); //<Person: 0x1004042c0> demo([Car class]);//<Car: 0x1004042c0> return 0; } void demo(Class c) //传什么类型的类就可以创建什么类型的对象 { id obj = [[c alloc] init]; NSLog(@"%@", obj); }