首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >respondsToSelector和class_getInstanceMethod

respondsToSelector和class_getInstanceMethod
EN

Stack Overflow用户
提问于 2013-04-11 02:37:40
回答 2查看 806关注 0票数 2

在内部,除了了解class_getInstanceMethod是否返回非nil之外,respondsToSelector还能做更多的事情吗?

respondsToSelector本质上是class_getInstanceMethod的包装器吗?如下所示:

代码语言:javascript
复制
- (BOOL)respondsToSelector:(SEL)sel {
  return class_getInstanceMethod(self, sel) != nil;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-16 03:35:39

在苹果的开源NSObject implementation中,respondsToSelector:位于1472行,如下所示:

代码语言:javascript
复制
- (BOOL)respondsToSelector:(SEL)sel { 
    if (!sel) return NO; 
    return class_respondsToSelector([self class], sel); 
}

反过来,class_respondsToSelector()位于objc-class.mm的第729行

代码语言:javascript
复制
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;
}
票数 4
EN

Stack Overflow用户

发布于 2013-04-11 02:39:27

-respondsToSelector:返回一个BOOL,本质上表明class_getInstanceMethod()是否会返回值。这回答了你的问题吗?

在传统的Objective-C代码中,与-performSelector:*的一种变体搭配使用的-respondsToSelector:更加惯用;很少看到(或需要)对运行时的直接调用。

编辑:实际的实现很可能基于调用class_respondsToSelector(),但我希望该运行时方法的实现与您的代码片段没有本质上的不同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15933762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档