简体   繁体   English

responsesToSelector和class_getInstanceMethod

[英]respondsToSelector and class_getInstanceMethod

Internally, does respondsToSelector do more than finding out if class_getInstanceMethod return non-nil? 在内部,不respondsToSelector做多找出若再class_getInstanceMethod返回非零?

Is respondsToSelector essentially a wrapper of class_getInstanceMethod? responsToSelector本质上是class_getInstanceMethod的包装吗? Like so: 像这样:

- (BOOL)respondsToSelector:(SEL)sel {
  return class_getInstanceMethod(self, sel) != nil;
}

In Apple's open-source NSObject implementation , respondsToSelector: is on line 1472 and looks like this: 在Apple的开源NSObject实现中respondsToSelector:在第1472行,如下所示:

- (BOOL)respondsToSelector:(SEL)sel { 
    if (!sel) return NO; 
    return class_respondsToSelector([self class], sel); 
}

class_respondsToSelector() in turn is on line 729 of objc-class.mm : class_respondsToSelector()依次在objc-class.mm的第729行上:

BOOL class_respondsToSelector(Class cls, SEL sel)
{
    IMP imp;

    if (!sel  ||  !cls) return NO;

    // Avoids +initialize because it historically did so.
    // We're not returning a callable IMP anyway.
    imp = lookUpMethod(cls, sel, NO/*initialize*/, YES/*cache*/, nil);
    return (imp != (IMP)_objc_msgForward_internal) ? YES : NO;
}

-respondsToSelector: returns a BOOL indicating, essentially, whether class_getInstanceMethod() would return a value. -respondsToSelector:返回一个BOOL ,从本质上指示class_getInstanceMethod()是否会返回值。 Does that answer your question? 这是否回答你的问题?

-respondsToSelector: paired with one of the variants of -performSelector:* is more idiomatic in conventional Objective-C code; -respondsToSelector:用的变体的一个配对的-performSelector:*是在常规Objective-C代码更地道; it's rare to see (or to need) direct calls to the runtime. 很少看到(或需要)直接调用运行时。

Edit : the actual implementation is likely based on calling class_respondsToSelector() , but I expect that the implementation of that runtime method is not fundamentally different than your code snippet. 编辑 :实际的实现可能是基于调用class_respondsToSelector() ,但是我希望该运行时方法的实现与您的代码段没有本质上的不同。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 使用class_getInstanceMethod - 在类层次结构中实现的方法在哪里? - Using class_getInstanceMethod - where is the method implemented in the class hierarchy? 如何使用Objective-C中的class_getInstanceMethod调用我保存的方法? - How can I call a Method that I saved using class_getInstanceMethod from Objective-C? 检查类responsesToSelector是否不起作用 - Checking if Class respondsToSelector not working 用于超级类调用的responsToSelector - respondsToSelector for super class invocation 类方法等效于-respondsToSelector: - Class method equivalent of -respondsToSelector: 如果类通过respondsToSelector响应选择器,则检查动态: - check dynamic if a class responds to a selector by respondsToSelector: 为什么class_respondsToSelector和respondsToSelector在发送给Class时表现不同? - Why do class_respondsToSelector and respondsToSelector behave different when sent to Class? 为什么可以在类名或类对象上使用-respondsToSelector:实例方法? - Why can -respondsToSelector: instance method be used on class name or class object? Objective-C:检查类类型,最好使用isKindOfClass或respondsToSelector? - Objective-C: Checking class type, better to use isKindOfClass, or respondsToSelector? (ConformsToProtocol:&& RespondsToSelector:)vs just(respondsToSelector:) - ( ConformsToProtocol: && RespondsToSelector: ) vs just ( respondsToSelector: )
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM