开发者

How can I know whether an instance implements a method in Objective-C?

开发者 https://www.devze.com 2022-12-25 09:11 出处:网络
I would like to know if an instance implements a specific method. I could use respondsToSelector: but it returns YES if the instance inherits the method...

I would like to know if an instance implements a specific method. I could use respondsToSelector: but it returns YES if the instance inherits the method...

I could loop through the methods of class_copyMethodList(), but since I might want to check a lot of instances, I wanted to know if there was a simpler solution (like repondsToSelector:, bu开发者_JAVA技巧t restricted to the class itself...)

edit: since I really think there is no function or method doing that, I wrote mine. Thanks for your answers, here is the method if it can be of any use :

+ (BOOL)class:(Class)aClass implementsSelector:(SEL)aSelector
{
    Method          *methods;
    unsigned int    count;
    unsigned int    i;

    methods = class_copyMethodList(aClass, &count);
    BOOL implementsSelector = NO;
    for (i = 0; i < count; i++) {
        if (sel_isEqual(method_getName(methods[i]), aSelector)) {
            implementsSelector = YES;
            break;
        }
    }
    free(methods);
    return implementsSelector;
}


It's probably easier to check whether the method your own class returns is the same or different than the method your superclass returns.

if ([[obj class] instanceMethodForSelector:sel] != [[obj superclass] instanceMethodForSelector:sel]) {
    NSLog(@"%@ directly implements %@", [obj class], NSStringFromSelector(sel));  
}


instance responds and super does not:

-(BOOL) declaresSelector:(SEL)inSelector {
  return [self respondsToSelector:inSelector] && ![super respondsToSelector:inSelector];
}

instance responds and is different than super:

-(BOOL) implementsSelector:(SEL)inSelector {
  return [self respondsToSelector:inSelector] && !( [super respondsToSelector:inSelector] && [self methodForSelector:inSelector] == [super methodForSelector:inSelector] );
}

According to Apple documents you should call respondsToSelector before methodForSelector.


You can use reflection to do that.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号