美文网首页
OC对象的分类

OC对象的分类

作者: 曹来东 | 来源:发表于2018-08-24 11:25 被阅读7次

OC对象的分类

- instance对象(实例对象)

instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象.instance对像在内存中存储的信息包括:其他成员变量 和 isa指针,因为所有对象都继承自NSObject,所以都有isa指针.

- class对象(类对象)

每个类在内存中有且只有一个class对象.在内存中存储的信息包括:

  • isa指针
  • superclass指针
  • 类的属性信息(@property),类的对象方法信息(instance method)
  • 类的协议信息(peotocol)类的成员变量信息(ivar)这里的ivar指的是成员变量的 类型 名字信息(这些信息只需要一份),ivar具体值存储在instance对象当中.

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

meta-class的获取:通过runtime函数: object_getClass(),传入的对象是class对象.而非instance对象.OC对象的class方法就是返回的class对象,如果要获取meta-class需要通过 object_getClass()方法.每个类在内存中有且只有一个meta-class对象.meta-class对象和 class对象的内存结构是一样的,但用途和存储的信息不同.meta-class中包含的信息:

  • isa指针
  • superclass指针
  • 类的类方法信息(class method)
  • ............
        NSObject * obj1 = [[NSObject alloc] init];
        //传入instcne对象获取的是class对象
        Class objClass4 = object_getClass(obj1);
        //传入class对象获取的是meta-class对象
        Class objMetaClass = object_getClass([obj1 class]);
        NSLog(@"objClass4 = %p",objClass4);
        NSLog(@"objMetaClass = %p",objMetaClass);
//NSLog
objClass4 = 0x7fff91cb8140//class对象
objMetaClass = 0x7fff91cb80f0//meta-class对象

Class 对象代码

        NSObject * obj1 = [[NSObject alloc] init];
        NSObject * obj2 = [[NSObject alloc] init];
        Class objClass1 = [obj1 class];
        Class objClass2 = [obj2 class];
        
        //注意:object_getClass 和 objc_getClass
        Class objClass3 = object_getClass(obj1);
        Class objClass4 = object_getClass(obj1);
        Class objClass5 = [NSObject class];
//NSLog
obj1 = 0x102a08920
obj2 = 0x102a04640
objClass1 = 0x7fff91cb8140
objClass2 = 0x7fff91cb8140
objClass3 = 0x7fff91cb8140
objClass4 = 0x7fff91cb8140
objClass5 = 0x7fff91cb8140

object_getClassobjc_getClass区别:

打开objc4源码,检索objc_getClass.查看.mm文件可以看到有objc-class-old.mmobjc-runtime-new.mm两个文件中有objc_getClass的实现.我们查看最新的文件.最终发现objc_getClass的实现在objc-runtime.mm文件中.

 1.Class objc_getClass(const char *aClassName)
 1> 传入字符串类名
 2> 返回对应的类对象
 
 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;
 }

相关文章

网友评论

      本文标题:OC对象的分类

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