oc39-- 类的内存存储

虚线是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);
}
原文地址:https://www.cnblogs.com/yaowen/p/7418088.html