self.delegate responsedsToSelector: ... не компилируется - PullRequest
33 голосов
/ 06 марта 2012

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

Нет Известный метод экземпляра для селектора 'respdsToSelector' .

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

//MyClass.h:

@class MyClass;

@Protocol MyClassDelegate
- (void)myClass:(MyClass *)sender willDoSomething:(BOOL)animated;
@end

@interface MyClass : UIViewController

@property (nonatomic, weak) id<MyClassDelegate> delegate;

@end

и

//MyClass.m:

...
@synthesize delegate = _delegate;
...

id sanitizedDelegate = self.delegate; //Hmmmm... why does this work?

if ([sanitizedDelegate respondsToSelector:@selector(myClass:willDoSomething:)]) {
    [self.delegate myClass:self willDoSomething:animated];
}

.

Я проверил несколько сообщений, включая этот , но он не отвечаетпроблема сбоя компиляции.

Кроме того, альтернативные средства доступа не работают ...

[self delegate]
//or
_delegate

Кто-нибудь видел это или может посоветовать лучший способ обработки?

IOS5.0: (9A334), Xcode 4.2.1 (4D502)

Ответы [ 2 ]

98 голосов
/ 06 марта 2012

-respondsToSelector: - это метод для NSObject. Либо предположим, что ваш id делегат на самом деле является NSObject, и приведите его:

[(NSObject*)self.delegate respondsToSelector:@selector(myClass:willDoSomething:)]

Или, лучше, сделать ваш делегат явно NSObject:

@property (nonatomic, weak) NSObject<MyClassDelegate>* delegate;

Или сделать протокол суб-протоколом NSObject:

@protocol MyClassDelegate <NSObject>

15 голосов
/ 06 марта 2012

По сути, вы говорите, что ваш делегат ограничен только вашим <MyClassDelegate> протоколом, поэтому компилятор предполагает, что это единственные доступные методы. То, что вам нужно сделать, это иметь расширение протокола <NSObject> примерно так:

@Protocol MyClassDelegate <NSObject>
- (void)myClass:(MyClass *)sender willDoSomething:(BOOL)animated;
@end

Таким образом, компилятор знает, что любой объект, который соответствует вашему протоколу, также соответствует протоколу <NSObject>, который определяет respondsToSelector:.

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