Обновление после просмотра вашей правки:
Объект класса отвечает на respondsToSelector:
очень хорошо, как вы, вероятно, знаете. В тестовом приложении я могу выполнить оба следующих действия без предупреждений компилятора:
NSLog(@"Responds to selector? %i", [MyObject respondsToSelector:@selector(respondsToSelector:)]);
NSLog(@"Responds to selector? %i", [[MyObject class] respondsToSelector:@selector(respondsToSelector:)]);
Однако вы объявили протокол для вашей переменной, поэтому предполагается, что объект класса, на который вы указываете, реализует эти методы. Самым простым решением было бы разыграть someClass
как id
с целью вызова respondsToSelector:
. Несколько более чистым решением было бы объявить свой собственный @protocol
, который объявляет +respondsToSelector:(SEL)selector
, а затем объявить someClass
следующим образом:
Class<SomeProtocol, ClassRespondingToSelector> someClass = ...
Наконец, обязательно отправьте сообщение об ошибке в Apple по адресу http://bugreporter.apple.com. Включите простое тестовое приложение, чтобы было очень ясно, что вы делаете. Они приветствуют такие сообщения об ошибках, даже если они были отправлены в прошлом, поскольку это помогает им расставить приоритеты для исправлений.
Последнее замечание: это, вероятно, происходит потому, что теоретически вы могли бы реализовать корневой объект, полностью отдельный от NSObject, и в этом случае он не будет отвечать на -respondsToSelector:
. -[NSObject respondsToSelector:]
фактически объявлено в протоколе NSObject
, а не в определении класса. Протокол NSObject
на самом деле является тем местом, где фактически живет то, что вы знаете как NSObject
Можно утверждать, что +respondsToSelector:
также должен быть там, но на данный момент это не так. А поскольку вы предоставили список протоколов, а метод там отсутствует, он дает вам предупреждение, чтобы вы знали, что делаете.