1.下面的代码的打印结果是什么
@interface MJPerson : NSObject
@end
@implementation MJPerson
@end
@interface MJStudent : MJPerson
@end
@implementation MJStudent
- (instancetype)init
{
self = [super init];
if (self) {
NSLog(@"self class: %@",[self class]);
NSLog(@"self superclass: %@",[self superclass]);
NSLog(@"super class: %@",[super class]);
NSLog(@"super superclass: %@",[super superclass]);
}
return self;
}
@end
打印结果是什么?
self class: MJStudent
self superclass: MJPerson
super class: MJStudent
super superclass: MJPerson
[super message]的底层实现
- 消息的接受者仍然是子类对象
- 只是从父类开始查找方法
NSObject底层实现
- (Class)class
{
return object_getClass(self);
}
- (Class)superClass
{
return class_getSuperclass(object_getClass(self));
}
2.下面的代码的打印结果是什么
id person = [[MJPerson alloc] init];
NSLog(@"%d", [person isMemberOfClass:[MJPerson class]]); // 1
NSLog(@"%d", [person isMemberOfClass:[NSObject class]]); // 0
NSLog(@"%d", [person isKindOfClass:[MJPerson class]]); // 1
NSLog(@"%d", [person isKindOfClass:[NSObject class]]); // 1
NSLog(@"%d", [NSObject isKindOfClass:[NSObject class]]); // 1
NSLog(@"%d", [NSObject isMemberOfClass:[NSObject class]]); // 0
NSLog(@"%d", [MJPerson isKindOfClass:[MJPerson class]]); // 0
NSLog(@"%d", [MJPerson isMemberOfClass:[MJPerson class]]); // 0
Foundation框架中有部分信息是对我们开源的,我们直接查看苹果官网的源码发现
- (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;
}
**- isKindOfClass:**是判断传入的对象是否是当前类对象以及当前类的子类对象
**- isMemberOfClass:**是判断传入的对象是否是当前类对象
**+ isKindOfClass:**是判断传入的对象是否是当前类的元类以及当前类子类的元类
**+ isMemberOfClass:**是判断传入的对象是否是当前类的元类