object_getClass
The class object of which object is an instance, or Nil if object is nil.
class方法是通过一个类对象或实例对象来获取类
object_getClass是获取一个类的元类或根元类, 是通过isa获取
isa本身就是class类型
每个对象里面还有一个 super_class 指针,指向父类, 注意和元类指针区分开来
Class isa,
Class super_class
Class current = [ViewController class];
NSLog(@"current = %@--%p",NSStringFromClass(current),current);
Class baseClass = object_getClass(current);
NSLog(@"baseClass = %@--%p",NSStringFromClass(baseClass),baseClass);
Class class02 = object_getClass(baseClass);
NSLog(@"class02 = %@--%p",NSStringFromClass(class02),class02);
Class class03 = object_getClass(class02);
NSLog(@"class03 = %@--%p",NSStringFromClass(class03),class03);
打印结果
TESTRuntime[13422:297689] current = ViewController--0x10a3c1dd8
TESTRuntime[13422:297689] baseClass = ViewController--0x10a3c1e00
TESTRuntime[13422:297689] class02 = NSObject--0x10b459ee8
TESTRuntime[13422:297689] class03 = NSObject--0x10b459ee8
分析得出: current 是ViewController类对象,
baseClass得到的是ViewController的元类对象,名字是一样的,但是地址却不一样
class02和class03都是根元类对象的地址
class03的地址证实了根源类指向自己,形成闭环
与objc_getClass的不同
objc_getClass
的返回值The Class object for the named class, or nil if the class is not registered with the Objective-C runtime.
objc_getClass是根据传入的字符串,获取这个字符串对应的类对象
- class_getInstanceMethod
获取一个类的对象方法
4.class_getClassMethod
获取一个类的类方法,
使用时注意, 编码中可以同时存在同名的对象和类方法, 且必须是有实现才行, 如果仅仅是声明, 则获取不到 例如
- (void)name {
}
+ (void)name {
}
objc_getMetaClass
objc_getMetaClass 是获取一个类的元类对象,
当object_getClass传入是类对象时,获取的也是元类对象
此时objc_getMetaClass 和 object_getClass 获取的是同一个元类对象
网友评论