底层原理:Runtime之super

2022-05-16  本文已影响0人  飘摇的水草
面试题
super相关

#import "MJPerson.h"

NS_ASSUME_NONNULL_BEGIN

@interface MJStudent : MJPerson

@end

#import "MJStudent.h"

@implementation MJStudent

- (instancetype)init
{
    if (self = [super init])
    {
        NSLog(@"%@", [self class]);
        NSLog(@"%@", [self superclass]);
        
        NSLog(@"%@", [super class]);
        NSLog(@"%@", [super superclass]);
    }
    return self;
}
@end

上面这道面试题的结果是:

2022-05-16 14:05:52.283291+0800 RacTest[11763:1023402] MJStudent
2022-05-16 14:05:52.283407+0800 RacTest[11763:1023402] MJPerson
2022-05-16 14:05:52.283448+0800 RacTest[11763:1023402] MJStudent
2022-05-16 14:05:52.283487+0800 RacTest[11763:1023402] MJPerson

这是因为

isKindOfClass和isMemberOfClass区别
    Person *person = [[Person alloc]init];
    [person run];
    
    NSLog(@"%d",[person isKindOfClass:[Person class]]);
    NSLog(@"%d",[person isKindOfClass:[NSObject class]]);
    
    NSLog(@"%d",[person isMemberOfClass:[Person class]]);
    NSLog(@"%d",[person isMemberOfClass:[NSObject class]]);

上面代码的输出结果是:

2022-06-02 17:46:55.743553+0800 TestPod[31311:2266385] 1
2022-06-02 17:46:55.743642+0800 TestPod[31311:2266385] 1
2022-06-02 17:46:55.743755+0800 TestPod[31311:2266385] 1
2022-06-02 17:46:55.743856+0800 TestPod[31311:2266385] 0

即使用 isKindOfClass 时,实例对象只要是类的子类或者当前类的对象即可,而 isMemberOfClass 必须要是当前类的对象,如果是判断类是否是某一种元类则用下面方法:object_getClass([Person class])

    NSLog(@"%d",[Person isMemberOfClass:object_getClass([Person class])]);
    NSLog(@"%d",[Person isMemberOfClass:object_getClass([Person class])]);
    
    NSLog(@"%d",[[Person class] isMemberOfClass:object_getClass([Person class])]);
    NSLog(@"%d",[[Person class] isMemberOfClass:object_getClass([Person class])]);
LLVM的中间代码
上一篇 下一篇

猜你喜欢

热点阅读