美文网首页将来跳槽用
笔记 - OC对象的分类

笔记 - OC对象的分类

作者: 强子ly | 来源:发表于2019-06-09 16:46 被阅读45次

    OC对象主要可以分为3种

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

    1、instance对象

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

    NSObject *object1 = [[NSObject alloc] init];
    NSObject *object2 = [[NSObject alloc] init];
    
    - object1、object2是NSObject的instance对象(实例对象)
    - 他们是不同的两个对象,分别占据着两块不同的内存
    - instance对象在内存中存储的信息包括:isa指针、其他成员变量。(不包括方法)
    

    2、class对象(类对象)

    NSObject *object1 = [[NSObject alloc] init];
    NSObject *object2 = [[NSObject alloc] init];
    
    Class objectClass1 = [object1 class];
    Class objectClass2 = [object2 class];
    Class objectClass3 = [NSObject class];
    Class objectClass4 = object_getClass(object1);
    Class objectClass5 = object_getClass(object2);
    
    NSLog(@"objectClass1 -- %p", objectClass1);
    NSLog(@"objectClass2 -- %p", objectClass2);
    NSLog(@"objectClass3 -- %p", objectClass3);
    NSLog(@"objectClass4 -- %p", objectClass4);
    NSLog(@"objectClass5 -- %p", objectClass5);
    
    2019-06-09 13:54:51.580909+0800 test[1014:62014] objectClass1 -- 0x1064a8f38
    2019-06-09 13:54:51.581285+0800 test[1014:62014] objectClass2 -- 0x1064a8f38
    2019-06-09 13:54:51.582838+0800 test[1014:62014] objectClass3 -- 0x1064a8f38
    2019-06-09 13:54:51.583026+0800 test[1014:62014] objectClass4 -- 0x1064a8f38
    2019-06-09 13:54:51.583245+0800 test[1014:62014] objectClass5 -- 0x1064a8f38
    
    • 一个类的类对象在内存中是唯一的
    • objectClass1 - objectClass5都是NSObject的class对象(类对象)
    • 他们是同一个对象,每个类在内存中有且只有一个class对象
    • class对象在内存中存储的信息主要包括
    - isa指针
    - superclass指针
    - 类的属性信息(@property)、类的对象方法信息(instance method)
    - 类的协议信息(@protocol)、类的成员变量信息(ivar)
    
    屏幕快照 2019-06-09 下午1.59.46.png

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

    • 元类对象获取
    // 将类对象当作参数传入,获得元类对象
    Class objectMetaClass = object_getClass([NSObject class]);
    
    // 查看Class是否为meta-class对象
    BOOL result = class_isMetaClass([NSObject class])
    
    // instance对象(实例对象)
    NSObject *object1 = [[NSObject alloc] init];
    NSObject *object2 = [[NSObject alloc] init];
    NSLog(@"instance1 -- %p", object1);
    NSLog(@"instance2 -- %p", object2);
    
    // class对象(类对象)
    Class objectClass1 = [object1 class];
    Class objectClass2 = [object2 class];
    Class objectClass3 = [NSObject class];
    Class objectClass4 = object_getClass(object1);
    Class objectClass5 = object_getClass(object2);
    
    NSLog(@"objectClass1 -- %p", objectClass1);
    NSLog(@"objectClass2 -- %p", objectClass2);
    NSLog(@"objectClass3 -- %p", objectClass3);
    NSLog(@"objectClass4 -- %p", objectClass4);
    NSLog(@"objectClass5 -- %p", objectClass5);
    
    // meta-class对象(元类对象)
    Class objectMetaClass = object_getClass([NSObject class]);
    NSLog(@"objectMetaClass -- %p", objectMetaClass);
    
    2019-06-09 14:08:52.824728+0800 test[1238:95272] instance1 -- 0x6000004b4f10
    2019-06-09 14:08:52.824888+0800 test[1238:95272] instance2 -- 0x6000004b4f30
    2019-06-09 14:08:52.824986+0800 test[1238:95272] objectClass1 -- 0x102c5af38
    2019-06-09 14:08:52.825059+0800 test[1238:95272] objectClass2 -- 0x102c5af38
    2019-06-09 14:08:52.825146+0800 test[1238:95272] objectClass3 -- 0x102c5af38
    2019-06-09 14:08:52.825225+0800 test[1238:95272] objectClass4 -- 0x102c5af38
    2019-06-09 14:08:52.825310+0800 test[1238:95272] objectClass5 -- 0x102c5af38
    2019-06-09 14:08:52.825385+0800 test[1238:95272] objectMetaClass -- 0x102c5aee8
    
    • objectMetaClass的NSObject的meta-class对象(元类对象)
    • 每个类在内存中有且只有一个meta-class对象
    • meta-class对象和class对象的内存结构是一样的,但是用途不一样,在内存中存储的信息主要包括
    - isa
    - superclass
    - 类方法信息
    
    屏幕快照 2019-06-09 下午2.14.49.png

    4、objc_getClass 和 object_getClass 的区别

    /*
     * Class  objc_getClass(<#const char * _Nonnull name#>)
     *
     * 1、传入字符串类名
     * 2、返回对应的类对象
     */
    
    /*
     * Class  object_getClass(<#id  _Nullable obj#>)
     *
     * 1、传入的obj可能是instance对象、class对象、meta-class对象
     * 2、返回值
         如果是instance对象,返回class对象
         如果是class对象,返回meta-class对象
         如果是meta-class对象,返回NSObject(基类)的meta-class对象
     */
    

    相关文章

      网友评论

        本文标题:笔记 - OC对象的分类

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