问题
1.isMemberOfClass,isKindOfClass 底层实现
2.练习题
3.super 的本质
答案
1.isMemberOfClass,isKindOfClass 底层实现
// 这个是对象方法,很明显就是判断 一个实例对象所指向的类对象是否 和 传入的对象是否一样
- (BOOL)isMemberOfClass:(Class)cls {
return [self class] == cls;
}
// 这个是对象方法,很明显就是判断 一个实例对象所指向的类对象是否 和 传入的对象是否一样 或者 是传入对象的子类
- (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
// 这个是类方法,很明显是判断一个类的元类对象 是否 和 传入的对象是否一样
+ (BOOL)isMemberOfClass:(Class)cls {
return object_getClass((id)self) == cls;
}
// 这个是类方法,很明显是判断一个类的元类对象 是否 和 传入的对象是否一样 或者 是 传入的对象的子类
+ (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = object_getClass((id)self); tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
2.练习题
提示: NSObject 的元 类对象 的 superClass 指向 的是 NSObject 的类对象
NSLog(@"%d", [[NSObject class] isKindOfClass:[NSObject class]]); // 结果为: 1
NSLog(@"%d", [[NSObject class] isMemberOfClass:[NSObject class]]);// 结果为: 0
NSLog(@"%d", [[MJPerson class] isKindOfClass:[MJPerson class]]);// 结果为: 0
NSLog(@"%d", [[MJPerson class] isMemberOfClass:[MJPerson class]]);// 结果为: 0
3.Super的本质
这个是我编译ViewController 得到的 cpp 部分源码,可以看书,super 本质 是调用了
objc_msgSendSuper() 方法里面涉及到了两个参数
图解:
super本质.png
第一个参数 :一个结构体
__rw_objc_super {
self, // 当前的 viewController 实例对象
class_getSuperclass(objc_getClass("ViewController")) // viewController 的 类对象的 父类
}
第二个参数: 方法名
sel_registerName("viewDidLoad")
static void _I_ViewController_viewDidLoad(ViewController * self, SEL _cmd) {
((void (*)(__rw_objc_super *, SEL))(void *)objc_msgSendSuper)((__rw_objc_super){(id)self, (id)class_getSuperclass(objc_getClass("ViewController"))}, sel_registerName("viewDidLoad"));
id cls = ((Class (*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("MJPerson"), sel_registerName("class"));
void *obj = &cls;
((void (*)(id, SEL))(void *)objc_msgSend)((id)obj, sel_registerName("print"));
}
网友评论