OC 对象的种类

分类

  • instance 对象(实例对象)
  • class 对象(类对象)
  • meta-class 对象 (元类对象)

instance 对象

通过类 alloc 出来的对象,叫实例对象,每次调用 alloc都会产生新的实例对象,分别占据着不同的内存。

instance 对象在内存中只存储着对象的成员变量和 isa

#import 

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        
        NSObject *obj = [[NSObject alloc] init];
        NSObject *obj1 = [[NSObject alloc] init];
        
        NSLog(@"obj - %p" ,obj);
        NSLog(@"obj1 - %p",obj1);
    }
    return 0;
}
2021-02-04 22:11:07.244727+0800 object[921:18627] obj - 0x100649ec0
2021-02-04 22:11:07.245284+0800 object[921:18627] obj1 - 0x10064b980

class 对象

获取类对象的方法:


#import 
#import 

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        
        NSObject *obj = [[NSObject alloc] init];
        NSObject *obj1 = [[NSObject alloc] init];
        
        NSLog(@"obj - %p" ,obj);
        NSLog(@"obj1 - %p",obj1);
        
        Class c =  [obj class];
        Class c1 = [obj1 class];
        Class c2 = [NSObject class];
        Class c3 = object_getClass(obj);
        Class c4 = object_getClass(obj1);

        
        NSLog(@"c - %p" , c);
        NSLog(@"c1 - %p", c1);
        NSLog(@"c2 - %p", c2);
        NSLog(@"c3 - %p", c3);
        NSLog(@"c4 - %p", c4);
        
    }
    return 0;
}

2021-02-04 22:19:14.469627+0800 object[1055:25117] c - 0x7fff88a9be08
2021-02-04 22:19:14.469667+0800 object[1055:25117] c1 - 0x7fff88a9be08
2021-02-04 22:19:14.469701+0800 object[1055:25117] c2 - 0x7fff88a9be08
2021-02-04 22:19:14.469731+0800 object[1055:25117] c3 - 0x7fff88a9be08
2021-02-04 22:19:14.469762+0800 object[1055:25117] c4 - 0x7fff88a9be08

可以看出获取到的地址是同一个地址,所以类对象是只有一个的,一个类有且只有一个类对象。

类对象在内存中存储的信息有:

  • isa 指针
  • superclass 信息
  • 类的属性信息
  • 类的对象方法信息
  • 类的协议信息
  • 类的成员变量信息(只存了描述信息),实际的值在每个对象中存储。

meta-class 对象

描述类信息的对象叫元类对象


#import 
#import 

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 传入类对象
        Class metaclass = object_getClass([NSObject class]);
        
        NSLog(@"meta class - %p", metaclass);
        
    }
    return 0;
}

2021-02-04 22:29:14.858705+0800 object[1149:29923] meta class - 0x7fff88a9bde0

class 方法一直返回的都是类对象,所以使用类对象调用 class 获取的依旧是类对象,而不是元类对象。

每个类只有一个元类对象

元类对象在内存中存储的信息有:

  • isa
  • superclass
  • 类的类方法信息

判断一个对象是否是元类对象

BOOL isMeta = class_isMetaClass(metaclass);

你可能感兴趣的:(OC 对象的种类)