源碼實(shí)現(xiàn)
減號(hào)開頭的方法
//判斷類對(duì)象是否是傳進(jìn)來的類對(duì)象
- (BOOL)isMemberOfClass:(Class)cls {
return [self class] == cls;
}
//判斷類對(duì)象是否是傳進(jìn)來的類對(duì)象類型或者類對(duì)象的子類
- (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
加號(hào)開頭的方法
//判斷類對(duì)象的元類是否是傳進(jìn)來的類對(duì)象
+ (BOOL)isMemberOfClass:(Class)cls {
return object_getClass((id)self) == cls;
}
//判斷類對(duì)象的元類 或者類對(duì)象的父類的元類 是否是傳進(jìn)來的類對(duì)象
+ (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = object_getClass((id)self); tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
// 這句代碼的方法調(diào)用者不管是哪個(gè)類(只要是NSObject體系下的)蹈胡,都返回YES
//子類的元類對(duì)象通過superClass可以拿到父類的元類對(duì)象 一層層往上拿可以拿到基類的元類對(duì)象 基類的元類對(duì)象superClass指向基類的類對(duì)象
NSLog(@"%d", [NSObject isKindOfClass:[NSObject class]]); // 1
NSLog(@"%d", [NSObject isMemberOfClass:[NSObject class]]); // 0
//[類對(duì)象 isKindOfClass:];左邊類對(duì)象的元類是否是右邊類
NSLog(@"%d", [Person isKindOfClass:[Person class]]); // 0
//[類對(duì)象 isKindOfClass:];左邊類對(duì)象的元類是否是右邊類 或者右邊類的父類
NSLog(@"%d", [Person isMemberOfClass:[Person class]]); // 0
NSLog(@"%d", [Person isMemberOfClass:object_getClass([MJPerson class])]); // 1
id person = [[Person alloc] init];
NSLog(@"%d", [person isMemberOfClass:[Person class]]);
NSLog(@"%d", [person isMemberOfClass:[NSObject class]]);
NSLog(@"%d", [person isKindOfClass:[Person class]]);
NSLog(@"%d", [person isKindOfClass:[NSObject class]]);
打印1趟咆、0、1赵誓、1