类对象

作者: AntKing | 来源:发表于2019-04-09 12:48 被阅读0次

    类对象

    • 我们创建的所有的继承自NSObject的类都一个类对象
    • 实例对象的内存地址是不同的
    • 但是类对象只有一个,获取到的类对象的内存地址相同
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            NSObject *object1 = [[NSObject alloc] init];
            NSObject *object2 = [[NSObject alloc] init];
            
            Class objectClass1 = [object1 class];
            Class objectClass2 = [object2 class];
            Class objectClass3 = object_getClass(object1);
            Class objectClass4 = object_getClass(object2);
            Class objectClass5 = [NSObject class];
            
      // 实例对象的内存地址是不同的
            NSLog(@"%p %p",
                  object1,
                  object2);
            // 但是类对象只有一个,获取到的类对象的内存地址相同
            NSLog(@"%p %p %p %p %p",
                  objectClass1,
                  objectClass2,
                  objectClass3,
                  objectClass4,
                  objectClass5);
        }
        return 0;
    }
    
    

    元类对象

    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            // instance对象,实例对象
            NSObject *object1 = [[NSObject alloc] init];
            NSObject *object2 = [[NSObject alloc] init];
            
            // class对象,类对象
            Class objectClass1 = [object1 class];
            Class objectClass2 = [object2 class];
            Class objectClass3 = object_getClass(object1);
            Class objectClass4 = object_getClass(object2);
            Class objectClass5 = [NSObject class];
            
            // meta-class对象,元类对象
            // 将类对象当做参数传入,获得元类对象
            Class objectMetaClass = object_getClass(objectClass5);
            // class方法返回的一直是class对象,类对象,不管调用多少次
            Class objectMetaClass2 = [[[NSObject class] class] class];
            
            NSLog(@"instance - %p %p",
                  object1,
                  object2);
            
            NSLog(@"class - %p %p %p %p %p %d",
                  objectClass1,
                  objectClass2,
                  objectClass3,
                  objectClass4,
                  objectClass5,
                  class_isMetaClass(objectClass3));
            
            NSLog(@"objectMetaClass - %p %d", objectMetaClass, class_isMetaClass(objectMetaClass));
            NSLog(@"objectMetaClass2 - %p %d", objectMetaClass2,class_isMetaClass(objectMetaClass2));
            
            
        }
        return 0;
    }
    
    
    

    object_getClass 的用法

    
     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;
     }
    
    
    
    isa-superclass.png

    相关文章

      网友评论

          本文标题:类对象

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