根据runtime中的objc4-646版本解析。
NSObject协议方法
第一个方法:判断是否和另一个对象相等
- (BOOL)isEqual:(id)obj {
return obj == self;
}
第二个方法:获得自己
- (id)self {
return self;
}
第三个方法:获得类对象
- (Class)class {
return object_getClass(self);
}
第四个方法:执行选择子
- (id)performSelector:(SEL)sel {
if (!sel) [self doesNotRecognizeSelector:sel];
return ((id(*)(id, SEL))objc_msgSend)(self, sel);
}
- (id)performSelector:(SEL)sel withObject:(id)obj {
if (!sel) [self doesNotRecognizeSelector:sel];
return ((id(*)(id, SEL, id))objc_msgSend)(self, sel, obj);
}
- (id)performSelector:(SEL)sel withObject:(id)obj1 withObject:(id)obj2 {
if (!sel) [self doesNotRecognizeSelector:sel];
return ((id(*)(id, SEL, id, id))objc_msgSend)(self, sel, obj1, obj2);
}
第四个方法:判断是否是某个类,就是不停的循环,先从当前类开始找,如果不是,再从父类找,找到返回YES,否则返回NO
- (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 [self class] == cls;
}
第六个方法:判断是否遵守某个协议,原理和第四个方法类似
- (BOOL)conformsToProtocol:(Protocol *)protocol {
if (!protocol) return NO;
for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
if (class_conformsToProtocol(tcls, protocol)) return YES;
}
return NO;
}
第七个方法:判断是否响应某个选择子
- (BOOL)respondsToSelector:(SEL)sel {
if (!sel) return NO;
return class_respondsToSelector_inst([self class], sel, self);
}