zoukankan      html  css  js  c++  java
  • 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);
    }
  • 相关阅读:
    [转] ORACLE 错误编号表一
    基于CkEditor实现.net在线开发之路(1)
    跨行清算系统的实现原理
    应用程序域
    支付机构客户备付金存管办法
    数据库培训二期试题
    MYSQL开发规范
    详解线上线下收单业务(一)第三方支付
    Solr安装配置说明
    进程(Process)
  • 原文地址:https://www.cnblogs.com/yaowen/p/7418088.html
Copyright © 2011-2022 走看看