美文网首页
OC 对象的种类

OC 对象的种类

作者: _一叶孤帆 | 来源:发表于2021-02-04 22:48 被阅读0次

    分类

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

    instance 对象

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

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

    #import <Foundation/Foundation.h>
    
    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 <Foundation/Foundation.h>
    #import <objc/runtime.h>
    
    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 <Foundation/Foundation.h>
    #import <objc/runtime.h>
    
    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 对象的种类

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