美文网首页将来跳槽用
笔记 - 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