美文网首页
OC对象的分类

OC对象的分类

作者: 曹来东 | 来源:发表于2018-08-24 11:25 被阅读7次

    OC对象的分类

    - instance对象(实例对象)

    instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象.instance对像在内存中存储的信息包括:其他成员变量 和 isa指针,因为所有对象都继承自NSObject,所以都有isa指针.

    - class对象(类对象)

    每个类在内存中有且只有一个class对象.在内存中存储的信息包括:

    • isa指针
    • superclass指针
    • 类的属性信息(@property),类的对象方法信息(instance method)
    • 类的协议信息(peotocol)类的成员变量信息(ivar)这里的ivar指的是成员变量的 类型 名字信息(这些信息只需要一份),ivar具体值存储在instance对象当中.

    - meta-class对象(元类对象)

    meta-class的获取:通过runtime函数: object_getClass(),传入的对象是class对象.而非instance对象.OC对象的class方法就是返回的class对象,如果要获取meta-class需要通过 object_getClass()方法.每个类在内存中有且只有一个meta-class对象.meta-class对象和 class对象的内存结构是一样的,但用途和存储的信息不同.meta-class中包含的信息:

    • isa指针
    • superclass指针
    • 类的类方法信息(class method)
    • ............
            NSObject * obj1 = [[NSObject alloc] init];
            //传入instcne对象获取的是class对象
            Class objClass4 = object_getClass(obj1);
            //传入class对象获取的是meta-class对象
            Class objMetaClass = object_getClass([obj1 class]);
            NSLog(@"objClass4 = %p",objClass4);
            NSLog(@"objMetaClass = %p",objMetaClass);
    //NSLog
    objClass4 = 0x7fff91cb8140//class对象
    objMetaClass = 0x7fff91cb80f0//meta-class对象
    

    Class 对象代码

            NSObject * obj1 = [[NSObject alloc] init];
            NSObject * obj2 = [[NSObject alloc] init];
            Class objClass1 = [obj1 class];
            Class objClass2 = [obj2 class];
            
            //注意:object_getClass 和 objc_getClass
            Class objClass3 = object_getClass(obj1);
            Class objClass4 = object_getClass(obj1);
            Class objClass5 = [NSObject class];
    //NSLog
    obj1 = 0x102a08920
    obj2 = 0x102a04640
    objClass1 = 0x7fff91cb8140
    objClass2 = 0x7fff91cb8140
    objClass3 = 0x7fff91cb8140
    objClass4 = 0x7fff91cb8140
    objClass5 = 0x7fff91cb8140
    

    object_getClassobjc_getClass区别:

    打开objc4源码,检索objc_getClass.查看.mm文件可以看到有objc-class-old.mmobjc-runtime-new.mm两个文件中有objc_getClass的实现.我们查看最新的文件.最终发现objc_getClass的实现在objc-runtime.mm文件中.

     1.Class objc_getClass(const char *aClassName)
     1> 传入字符串类名
     2> 返回对应的类对象
     
     2.Class object_getClass(id obj)
     1> 传入的obj可能是instance对象、class对象、meta-class对象
     2> 返回值
     a) 如果是instance对象,返回class对象
     b) 如果是class对象,返回meta-class对象
     c) 如果是meta-class对象,返回NSObject(基类)的meta-class对象
     
     3.- (Class)class、+ (Class)class
     1> 返回的就是类对象
     
     - (Class) {
         return self->isa;
     }
     
     + (Class) {
         return self;
     }
    

    相关文章

      网友评论

          本文标题:OC对象的分类

          本文链接:https://www.haomeiwen.com/subject/kazviftx.html