这两个方法可能有些人容易记混。特别都存在对象方法和类方法
其实通过底层源码可知,这两个方法的重点:
一、清楚isKindOfClass是看消息接收者(当前类)和传入的类是否相等,如果不相等看消息接受者的superClsass和传入的类是否相等。而isMemberOfClass就是比较消息接收者和传入的类是否相等
二、isa指向。当使用对象方法时,isa指向肯定是类对象,分析类对象即可。当使用类方法时,isa的指向肯定就是元类。比较元类即可
代码分析:Student继承Person,Person继承NSObject
------实例方法------
Person *p = [Person new];
Student *s = [Student new];
//下面输出结果为0,显然s的类对象和Nsobject的类对象不同
NSLog(@"%d",[s isMemberOfClass:[NSObject class]]);
//输出结果为1.因为s的类对象和NSObject的类对象不相同,当遍历查找s的SuperClass时,最终查找到根类的类对象,就是NSObject的类对象
NSLog(@"%d",[s isKindOfClass:[NSObject class]]);
//同理输出结果为1
NSLog(@"%d",[p isKindOfClass:[NSObject class]]);
//..其它可同理去分析
--------类方法-------
//输出结果为0,类方法时比较的是元类,看后面传入的类就知道不会相等
NSLog(@"%d",[Person isKindOfClass:[Person class]]);
//输出结果为1,Person元类的SuperClass指向Nsobject的元类
NSLog(@"%d",[Person isKindOfClass:object_getClass([NSObject class])]);
//输出结果为0
NSLog(@"%d",[Person isMemberOfClass:object_getClass([NSObject class])]);
网友评论