Super 调用方法原理

203 阅读1分钟

Super 调用方法原理

///1:receiver 接收者 仍然是本对象
///2:super 仅代表从父类开始搜索方法
 * id objc_msgSendSuper(struct objc_super *super, SEL op, ...)
 *
 * struct objc_super {
 *     id receiver;//消息接收者
 *     Class cls;	// the class to search //从什么地方开始搜索
 * }

isKindOfCalss/isMerberOfClass

///本质会使用类对象和元类对象比较
NSLog(@"%d",[Person isKindOfClass:[Person class]]);///0
NSLog(@"%d",[Person isMemberOfClass:[Person class]]);//0

NSLog(@"%d",[NSObject isMemberOfClass:[NSObject class]]);//0
///方法查找顺序 superclass 到最后会 查找到类对象
NSLog(@"%d",[NSObject isKindOfClass:[NSObject class]]);//1
///
+ (BOOL)isMemberOfClass:(Class)cls {
    ///self->ISA() 获取元类对象
    return self->ISA() == cls;
}

- (BOOL)isMemberOfClass:(Class)cls {
    ///[self class] 获取类对象
    return [self class] == cls;
}

+ (BOOL)isKindOfClass:(Class)cls {
    ///tcls->superclass 父类查找
    for (Class tcls = self->ISA(); tcls; tcls = tcls->superclass) {
        if (tcls == cls) return YES;
    }
    return NO;
}

- (BOOL)isKindOfClass:(Class)cls {
    for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
        if (tcls == cls) return YES;
    }
    return NO;
}