OC对象的分类

简介:Objective-C中的对象,简称OC对象。主要分三种。

  1. instance对象(实例对象)
  2. class对象(类对象)
  3. meta-class对象(元类对象)
一、instance(实例对象)

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

NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];
  1. obj1、obj2都是NSObject的instance对象,他们是不同的2个实例对象,占据不同的内存地址。

  2. instance实例对象在内存中存储的信息包括:成员变量的值、isa指针(NSObject对象)。不包括方法。

  3. isa指针存储的就是NSObject对象的信息,也就是instance对象的地址指针。

二、class(类对象)

一个类的类对象是唯一的,在内存中只有一份。

// instance 实例对象
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];

// class 类对象
// class方法不论调用多少次,返回的都是class对象,即类对象
Class objC1 = [obj1 class];
Class objC2 = [obj2 class];
Class objC3 = object_getClass(obj1);
Class objC4 = object_getClass(obj2);
Class objC5 = [NSObject class];
NSLog(@"-%p-%p-%p-%p-%p-", objC1,objC2,objC3,objC4,objC5);

// 将类对象当中参数传入,获得元类对象
// 将实例对象当参数传入,获得类对象
// meta-class  元类对象
Class objMetaC = object_getClass([NSObject class]);

2019-01-19 16:47:23.148311+0800 Interview[708:1302172] -0x7fff94951140-0x7fff94951140-0x7fff94951140-0x7fff94951140-0x7fff94951140-
2019-01-19 17:00:36.704993+0800 Interview[765:1307149] -0x7fff949510f0-
  • objC1-objC5都是NSObject的类对象,他们都是同一个对象
  • 每个类在内存中有且只有一个class对象
  • class对象在内存中存储的信息包括:
    • isa指针
    • superclass指针
    • 类的对象方法信息(instance method)
    • 类的属性信息(@property)
    • 类的协议信息,类的成员变量描述信息(ivar)
三、meta-class(元类对象)
// 将类对象当中参数传入,获得元类对象
Class objMetaC = object_getClass([NSObject class]);
  • objMetaC是NSObject的元类对象
  • 每个类在内存中有且只有一个元类对象
  • meta-class对象和class对象在内存中结构是一样的,但是用途不一样,在内存中存储的信息主要有:
    • isa指针
    • superclass指针
    • 类的类方法信息(class method)

注意:

// 获取的是class对象,不是meta-class对象
Class objC = [[NSObject class] class]; 
// 查看Class是否为元类对象:
BOOL result = class_isMetaClass([NSObject class]);

知识点:下面三个方法的区别

objc_getClass(xxx)
object_getClass(xxx)
[xxx class];

分析:

// 传入的是类名的字符串,返回类名对应的类对象
Class objc_getClass(const char *aClassName)
{
    if (!aClassName) return Nil;

    // NO unconnected, YES class handler
    return look_up_class(aClassName, NO, YES);
}
// 返回的是isa
Class object_getClass(id obj)
{
    // 如果是instance对象,则返回class对象
    // 如果是class对象,则返回meta-class对象
    // 如果是meta-class对象,则返回NSObject(基类)的meta-class对象
    if (obj) return obj->getIsa();
    else return Nil;
}
// 返回类对应的类对象,不会返回元类对象
+ (Class)class OBJC_SWIFT_UNAVAILABLE("use 'aClass.self' instead");

结果:

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对象, 返回NS0bject (基类)的meta-class对象

3.- (Class)class、+ (Class)class
  1>返回的就是类对象

注意:方法的实现就是某个方法对应的IMP

猜你喜欢

转载自blog.csdn.net/weixin_33895695/article/details/87490418