Objective c 方法是类方法还是实例方法

Objective c 方法是类方法还是实例方法,objective-c,Objective C,在我的代码中,我想知道方法是类方法还是实例方法。我目前使用的代码是有效的,但我想知道是否有更好的方法 如果是类方法或实例,则要“检测”的当前代码: Method method = class_getInstanceMethod(class, selector); if (method) { __strong Class object = [[class alloc] init]; objc_msgSend(object, selector); }else { method = cla

在我的代码中,我想知道方法是类方法还是实例方法。我目前使用的代码是有效的,但我想知道是否有更好的方法

如果是类方法或实例,则要“检测”的当前代码:

Method method = class_getInstanceMethod(class, selector);
if (method) {
  __strong Class object = [[class alloc] init];
  objc_msgSend(object, selector);
}else {
  method = class_getClassMethod(class, selector);
  if (method) {
    objc_msgSend(class, selector);
  }
}

除了两条
if
语句之外,几乎没有什么可以改进的。您可以使用
respondsToSelector:
方法,但由于您没有对象开始,因此在
if
中会出现
if
,而不是外观更好的
else if

if ([class respondsToSelector:selector]) {
    // Call class method
} else {
    id object = [[class alloc] init];
    if ([object respondsToSelector:selector]) {
        // Call instance method
    }
}
如果可以修改程序流以对象而不是类开始,则可以执行以下操作:

if ([object respondsToSelector:selector]) {
    // Call instance method
} else if ([[object class] respondsToSelector:selector]) {
    // Call class method
}

我很确定你的代码无法改进。如果您真的愿意,您可以将objc\u msgSend更改为
性能选择器:
,但这样做没有实际意义。我很好奇您在这里的动机。objective=c中的每个签名都会告诉您它是类方法还是实例方法,所以我很好奇为什么在运行时需要这个time@NuclearGhost我想对可能不存在的对象调用一个方法。这可以是实例方法或类方法。Warren Burton为什么要反转,因为它只有在是类方法时才会实例化。可能无法导入此对象文件。这是一个通用函数。例如,我可以创建两个函数,一个用于类,另一个用于类respondsToSelector@MouNtant方法是选择器,对象有选择器。这比你在问题中发布的代码要简单得多overkill@MouNtant我没有意识到一开始你没有
对象
。我以与您相同的方式编辑了答案,以类方法开始。@SimonMcLoughlin我觉得这段代码基本上是相同的,并且不太简单。(回答中的代码已更改)@MouNtant我犯了相同的错误,没有注意到对象init。仍然认为它更干净,更可读的方式。还有,为什么你总是在向上投票和向下投票之间切换。不管怎样,它仍然是可靠的代码