Как узнать, реализует ли экземпляр метод в Objective-C? - PullRequest
4 голосов
/ 04 апреля 2010

Я хотел бы знать, реализует ли экземпляр определенный метод.Я мог бы использовать respondsToSelector:, но он возвращает YES, если экземпляр наследует метод ...

Я мог бы пройтись по методам class_copyMethodList(), но, так как я мог бы хотеть проверить много экземпляров, я хотелузнать, было ли более простое решение (например, repondsToSelector:, но ограничено самим классом ...)

edit: так как я действительно думаю, что нет функции или метода, делающего это, я написал свой.Спасибо за ваши ответы, вот метод, если он может быть полезным:

+ (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;
}

Ответы [ 3 ]

3 голосов
/ 05 апреля 2010

Вероятно, проще проверить, является ли метод, который возвращает ваш собственный класс, тем же или отличным от метода, который возвращает ваш суперкласс.

if ([[obj class] instanceMethodForSelector:sel] != [[obj superclass] instanceMethodForSelector:sel]) {
    NSLog(@"%@ directly implements %@", [obj class], NSStringFromSelector(sel));  
}
3 голосов
/ 05 апреля 2010

экземпляр отвечает, а супер не:

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

экземпляр отвечает и отличается от супер:

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

В соответствии с документами Apple, перед вызовом методаForSelector следует вызывать RespondsToSelector.

1 голос
/ 04 апреля 2010

Для этого можно использовать отражение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...