super关键字,class

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]的底层实现

  1. 消息的接受者仍然是子类对象
  2. 只是从父类开始查找方法

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:**是判断传入的对象是否是当前类的元类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值