美文网首页
OC对象的分类

OC对象的分类

作者: iLeooooo | 来源:发表于2019-01-19 17:57 被阅读38次

    简介:Objective-C中的对象,简称OC对象。主要分三种。

    1. instance对象(实例对象)
    2. class对象(类对象)
    3. meta-class对象(元类对象)
    一、instance(实例对象)

    instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象。

    NSObject *obj1 = [[NSObject alloc] init];
    NSObject *obj2 = [[NSObject alloc] init];
    
    1. obj1、obj2都是NSObject的instance对象,他们是不同的2个实例对象,占据不同的内存地址。

    2. instance实例对象在内存中存储的信息包括:成员变量的值、isa指针(NSObject对象)。不包括方法。

    3. isa指针存储的就是NSObject对象的信息,也就是instance对象的地址指针。

    二、class(类对象)

    一个类的类对象是唯一的,在内存中只有一份。

    // instance 实例对象
    NSObject *obj1 = [[NSObject alloc] init];
    NSObject *obj2 = [[NSObject alloc] init];
    
    // class 类对象
    // class方法不论调用多少次,返回的都是class对象,即类对象
    Class objC1 = [obj1 class];
    Class objC2 = [obj2 class];
    Class objC3 = object_getClass(obj1);
    Class objC4 = object_getClass(obj2);
    Class objC5 = [NSObject class];
    NSLog(@"-%p-%p-%p-%p-%p-", objC1,objC2,objC3,objC4,objC5);
    
    // 将类对象当中参数传入,获得元类对象
    // 将实例对象当参数传入,获得类对象
    // meta-class  元类对象
    Class objMetaC = object_getClass([NSObject class]);
    
    2019-01-19 16:47:23.148311+0800 Interview[708:1302172] -0x7fff94951140-0x7fff94951140-0x7fff94951140-0x7fff94951140-0x7fff94951140-
    2019-01-19 17:00:36.704993+0800 Interview[765:1307149] -0x7fff949510f0-
    
    • objC1-objC5都是NSObject的类对象,他们都是同一个对象
    • 每个类在内存中有且只有一个class对象
    • class对象在内存中存储的信息包括:
      • isa指针
      • superclass指针
      • 类的对象方法信息(instance method)
      • 类的属性信息(@property)
      • 类的协议信息,类的成员变量描述信息(ivar)
    三、meta-class(元类对象)
    // 将类对象当中参数传入,获得元类对象
    Class objMetaC = object_getClass([NSObject class]);
    
    • objMetaC是NSObject的元类对象
    • 每个类在内存中有且只有一个元类对象
    • meta-class对象和class对象在内存中结构是一样的,但是用途不一样,在内存中存储的信息主要有:
      • isa指针
      • superclass指针
      • 类的类方法信息(class method)

    注意:

    // 获取的是class对象,不是meta-class对象
    Class objC = [[NSObject class] class]; 
    // 查看Class是否为元类对象:
    BOOL result = class_isMetaClass([NSObject class]);
    

    知识点:下面三个方法的区别

    objc_getClass(xxx)
    object_getClass(xxx)
    [xxx class];
    

    分析:

    // 传入的是类名的字符串,返回类名对应的类对象
    Class objc_getClass(const char *aClassName)
    {
        if (!aClassName) return Nil;
    
        // NO unconnected, YES class handler
        return look_up_class(aClassName, NO, YES);
    }
    
    // 返回的是isa
    Class object_getClass(id obj)
    {
        // 如果是instance对象,则返回class对象
        // 如果是class对象,则返回meta-class对象
        // 如果是meta-class对象,则返回NSObject(基类)的meta-class对象
        if (obj) return obj->getIsa();
        else return Nil;
    }
    
    // 返回类对应的类对象,不会返回元类对象
    + (Class)class OBJC_SWIFT_UNAVAILABLE("use 'aClass.self' instead");
    

    结果:

    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对象, 返回NS0bject (基类)的meta-class对象
    
    3.- (Class)class、+ (Class)class
      1>返回的就是类对象
    

    注意:方法的实现就是某个方法对应的IMP

    相关文章

      网友评论

          本文标题:OC对象的分类

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