Person
繼承自NSObject
, main
函數中代碼以下isKindOfClass:
和isMemberOfClass:
兩個方法, 底層代碼是開源的- (BOOL)isMemberOfClass:(Class)cls {
return [self class] == cls;
}
複製代碼
self
的類方法, 與傳入的Class
進行對比, 若是相同返回YES
, 不然返回NO- (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
複製代碼
[self class]
與傳入cls
對比,
[[self class] supperclass]
與cls
對比YES
, 若是最後也沒有匹配成功就會返回NO
+ (BOOL)isMemberOfClass:(Class)cls {
return object_getClass((id)self) == cls;
}
複製代碼
self
的元類對象
與傳入的cls
進行對比, 若是相同返回YES
, 不然返回NO
+ (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = object_getClass((id)self); tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
複製代碼
self
的元類對象
與傳入的cls
進行對比
YES
object_getClass(self)->superclass
與cls
對比, 依次類推YES
, 若是最後也沒有匹配成功就會返回NO
1
// [NSObject class] == [NSObject class]
NSLog(@"%d", [[Person class] isKindOfClass:[NSObject class]]);
// [NSObject class] == [NSObject class]
NSLog(@"%d", [[NSObject class] isKindOfClass:[NSObject class]]);
複製代碼
cls
參數都是[NSObject class]
那麼爲何, 這兩句代碼的結果相等呢?面試
superclass
查找父類的過程當中, 若是是經過元類對象
查找, 根類NSObject元類對象
的superclass
是[NSObject class]
元類
的superclass
, 最終都會找到[NSOject class]
, 因此上面兩句代碼的結果是相等的總結:
只要是isKindOfClass:
方法的cls
參數是[NSObject class]
, 那麼調用者只要是NSObject
或者NSObject
的子類, 那麼結果都是YESbash
// 元類對象最後會經過`superclass`找到[NSObject class], 因此結果相等, 結果是1
NSLog(@"%d", [NSObject isKindOfClass:[NSObject class]]);
// objc_getClass([NSObject class]) != [NSObject class] 結果是0
NSLog(@"%d", [NSObject isMemberOfClass:[NSObject class]]);
// objc_getClass([Person class]) != [Person class] 結果是0
NSLog(@"%d", [Person isKindOfClass:[Person class]]);
// objc_getClass([Person class]) != [Person class] 結果是0
NSLog(@"%d", [Person isMemberOfClass:[Person class]]);
複製代碼