Как решить "нет известного метода экземпляра для селектора" executeSelector: withObject: afterDelay: '"при миграции на ARC? - PullRequest
14 голосов
/ 13 января 2012

Средство миграции ARC отказывается принимать этот код до начала миграции:

[self.delegate performSelector:@selector(overlayDismissed:) withObject:self afterDelay:0];

Делегат вынужден реализовать этот метод с протоколом, и он должен нормально работать:

@protocol OverlayDelegate <NSObject>
- (void)overlayDismissed:(Overlay*)overlay;
@end

@interface Overlay : UIImageView {
    id<OverlayDelegate> delegate;
}

@property (nonatomic, assign) id<OverlayDelegate> delegate;

Что не так с ARC?Почему он говорит мне, что «нет известного метода экземпляра для селектора» executeSelector: withObject: afterDelay: '?

Ответы [ 4 ]

16 голосов
/ 13 января 2012

ARC не вызывает это - это просто разоблачает это. Этот метод определен в NSObject - но id работает не только для NSObject (поэтому вам нужно быть более конкретным, чем просто 'id'). Измените свой код на это:

@interface Overlay : UIImageView {
    NSObject<OverlayDelegate> *delegate;
}

@property (nonatomic, assign) NSObject<OverlayDelegate> *delegate;
3 голосов
/ 13 января 2012

Простой, ваш объект имеет тип id и соответствует протоколу NSObject.Однако этот протокол не объявляет performSelector:withObject:afterDelay:, поэтому ARC не знает, что делает метод, и должно ли оно что-либо сохранять.Либо используйте объект NSObject, либо приведите его перед вызовом метода.

0 голосов
/ 11 августа 2016

Я встретил ошибку:

Не известен метод класса для селектора conformsToProtocol:

Причина в том, что: имя файла не равно имени класса с @interface и @implementation.

0 голосов
/ 13 января 2012

Я понял, что приведение делегата к NSObject * решает проблему:

[self.delegate performSelector:@selector(overlayDismissed:) withObject:self afterDelay:0];

По какой-то странной причине автозаполнение даже не пришло -performSelector:withObject:afterDelay:, поэтому мне пришлось набирать его вручную. Вместо этого он предложил только -performSelector: и -performSelector:withObject:withObject:

Я предполагаю, что глупо использовать id в качестве типа для делегатов в Objective-C, и я никогда не знал, почему все, включая меня, делают это, а не просто определяют его как NSObject. Однако в моем протоколе даже сказано, что тот, кто соответствует этому протоколу, также должен соответствовать протоколу NSObject, выполняя это: OverlayDelegate <NSObject> - и все же компилятор не получил его.

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

...