概述
先簡單的說,兩個(gè)都是NSObject用于比較 Class 的方法忘蟹,不同之處在于:isKindOfClass可用于判斷對象是否是一個(gè)類的成員飒房,或者是該類子類的成員搁凸;isMemberOfClass可用于判斷對象是否是當(dāng)前類『萏海或者可以這么理解:isKindOfClass 判斷是否是自己或者父類, isMemberOfClass 判斷是否是自己护糖。
isKindOfClass定義:Returns a Boolean value that indicates whether the receiver is an instance of given class or an instance of any class that inherits from that class.
isMemberOfClass定義:Returns a Boolean value that indicates whether the receiver is an instance of a given class.
解析:
透過runtime源碼分析到,其實(shí)類對象也可以使用這兩個(gè)方法的:
+ (Class)class {
return self;
}
- (Class)class {
return object_getClass(self);
}
+ (Class)superclass {
return self->superclass;
}
- (Class)superclass {
return [self class]->superclass;
}
+ (BOOL)isMemberOfClass:(Class)cls {
return self->ISA() == cls;
}
- (BOOL)isMemberOfClass:(Class)cls {
return [self class] == cls;
}
+ (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = self->ISA(); tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
- (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
從runtime源碼中我們可以看到類對象和實(shí)例對象分別有對應(yīng)的+ (BOOL)isKindOfClass:(Class)cls和- (BOOL)isKindOfClass:(Class)cls方法嚼松。
接下來舉一些例子來詳細(xì)認(rèn)識:
1.BOOL result1 = [[NSObject class] isKindOfClass:[NSObject class]]; // YES
2.BOOL result2 = [[NSObject class] isMemberOfClass:[NSObject class]]; //NO
3.BOOL result3 = [[Person class] isKindOfClass:[Person class]]; //NO
4.BOOL result4 = [[Person class] isMemberOfClass:[Person class]]; //NO
5.BOOL result5 = [[Person class] isKindOfClass:[NSObject class]]; // YES
+ (BOOL)isKindOfClass:(Class)cls分析:
當(dāng)調(diào)用對象為類對象的時(shí)候嫡良,我們可以發(fā)現(xiàn)其底層是一個(gè)循環(huán)遍歷判斷。
BOOL result1 = [[NSObject class] isKindOfClass:[NSObject class]]
當(dāng)A對象為NSObject對象時(shí)献酗,其isa指針指向的是NSObject元類(Meta)寝受,所以第一次循環(huán)元類和類對象肯定是不相等的。接下來第二次循環(huán)是元類對象的superclass指向的是NSObject本身,所以第二次循環(huán)是返回True的罕偎。
+ (BOOL)isMemberOfClass:(Class)cls分析
類方法中只是簡單的做了一個(gè)isa指針和class之間的比較很澄。所以,無論是NSObject的isa還是繼承自NSObject的子類的isa都是指向A對象的元類,元類是類本身肯定是不一樣的颜及。
針對上頭的例子甩苛,都是類對象,具體來看:
//問題1: 已經(jīng)說明俏站,有兩次循環(huán)讯蒲,第二次會(huì)相等
BOOL result1 = [[NSObject class] isKindOfClass:[NSObject class]];
//問題2:類方法是直接拿A對象的isa比較,元類和類不同肄扎,所以不相等
BOOL result2 = [[NSObject class] isMemberOfClass:[NSObject class]];
//問題3:逐次循環(huán)分析
//第一次:Person->isa = Person Meta != Person
//第二次:Person Meta -> superclass = NSObject Meta != Person
//第三次:我們看到左邊A對象的superclass會(huì)一直沿著關(guān)系圖往上走墨林,一直到nil都不會(huì)相等
BOOL result3 = [[Person class] isKindOfClass:[Person class]];
//和問題2相同也不會(huì)相等,類方法是直接拿A對象的isa比較反浓,元類和類不同萌丈,所以不相等
BOOL result4 = [[Person class] isMemberOfClass:[Person class]];
//問題5:逐次循環(huán)分析
//第一次:Person->isa = Person Meta != NSObject
//第二次:Person Meta -> superclass = NSObject Meta != NSObject
//第二次:NSObject Meta -> superclass = NSObject == Person
5.BOOL result5 = [[Person class] isKindOfClass:[NSObject class]]; // YES
第二波舉例:
NSArray *arr1 = [NSArray array];
NSArray *arr2 = [NSArray array];
NSObject *ob = [[NSObject alloc] init];
1.BOOL result1 = [[NSArray array] isKindOfClass:[NSObject class]]; // YES
2.BOOL result2 = [[NSArray array] isMemberOfClass:[NSArray class]]; // NO
3.BOOL result3 = [arr1 isKindOfClass:[ob class]]; // YES
4.BOOL result4 = [arr1 isMemberOfClass:[ob class]]; // NO
5.BOOL result5 = [arr1 isKindOfClass:[arr2 class]]; // YES
6.BOOL result6 = [arr1 isMemberOfClass:[arr2 class]]; // YES
針對上頭的例子,都是類實(shí)例雷则,具體來看:
//問題1:逐次循環(huán)分析
//第一次:[NSArray array] != [NSObject class]
//第二次:[NSArray array] -> superclass = [NSObject class] == [NSObject class]
1.BOOL result1 = [[NSArray array] isKindOfClass: [NSObject class]]; // YES
//問題2:[NSArray array] == [NSArray class]
//2.BOOL result2 = [[NSArray array] isMemberOfClass:[NSArray class]]; // NO
//問題3:逐次循環(huán)分析
//第一次:[NSArray array] != [NSObject class]
//第二次:[NSArray array] -> superclass = [NSObject class] == [NSObject class]
//3.BOOL result3 = [arr1 isKindOfClass:[ob class]]; // YES
//問題4:[NSArray array] != [NSObject class]
4.BOOL result4 = [arr1 isMemberOfClass:[ob class]]; // NO
//問題5:逐次循環(huán)分析
//第一次:[NSArray array] == [NSArray array]
5.BOOL result5 = [arr1 isKindOfClass:[arr2 class]]; // YES
//問題6:[NSArray array] == [NSArray array]
6.BOOL result6 = [arr1 isMemberOfClass:[arr2 class]]; // YES