day2 OC对象的分类

238 阅读2分钟

Instance 实例对象

  1. Instance对象就是通过类alloc出来的对象,每次调用alloc,都会产生新的instance对象
    • alloc 方法是申请内存并创建实例对象
    • init 是自定义的初始化方法,它应该一直被重写
NSObject *object1 = [[NSObject alloc] init]; // 实例对象
NSObject *object2 = [[NSObject alloc] init]; // 实例对象
// 它们3个指向的是同一个对象
NSObject *p1 = [NSObject alloc];
NSObject *p2 = p1;
NSObject *p3 = p1;
  1. object1、object2 是NSObject 的实例对象
  2. 它们是不同的两个对象,占据不同的内存空间
  3. instance对象存储的信息包括:(因为isa也是一个成员变量,所以instance对象只存储它的成员变量)
    • isa 指针
    • 其他成员变量

Class 类对象

NSObject *object1 = [[NSObject alloc] init]; // 实例对象
NSObject *object2 = [[NSObject alloc] init]; // 实例对象

Class objectClass1 = [object1 class]; // 类对象
Class objectClass2 = [object2 class]; // 类对象
Class objectClass3 = [NSObject class]; // 类对象
// runtime 中的方法
Class objectClass4 = object_getClass(object1); // 类对象
Class objectClass5 = object_getClass(object2); // 类对象
  1. objectClass1 - objectClass5 都是NSObject 的 class 对象(类对象)。
  2. 他们是同一个对象。每个类在内存中有且只有一个类对象。
  3. class 对象在内存中主要存储的信息有:
    • isa指针
    • superClass指针
    • 类的属性信息(@property)
    • 类的对象方法信息(instance method)
    • 类的协议信息(protocol)
    • 类的成员变量(ivar)
    • ······

meta-Class 元类对象

Class metaClass = object_getClass([NSObject class]);

  1. metaClass 是NSObject 的meta-class对象(元类对象)
  2. 每个类在内存中有且仅有一个 meta-class 对象
  3. meta-class 对象和 class 对象在内存中的结构是一样的,但是用途不一样, 在内存中存储的主要信息包括:
    • isa指针
    • superclass指针
    • 类的类方法信息(class method)

涉及到的方法

  1. Class metaClass = object_getClass([NSObject class]); 传入的obj可能是instance对象、class对象、meta-class对象
// 返回的是对象指针指向的内容
// 传入instance对象 -> 返回class对象 
// 传入class对象 -> 返回meta-class对象
// 传入meta-class对象 -> 返回 NSObject(基类)的meta-class对象
Class object_getClass(id obj)
 {
     if (obj) return obj->getIsa();
     else return Nil;
 }
  1. Class objc_getClass(const char *aClassName)

    • 传入字符串类名
    • 返回对应的类对象
  2. -(Class)class; : 返回的就是类对象

 (Class) {
     return self->isa;
 }
 
 (Class) {
     return self;
 }