Это потому, что компилятору необходимо знать сигнатуру метода для его вызова (т. Е. [self doNow];
), потому что такой вызов преобразуется либо в вызов objc_msgSend
, либо objc_msgSend_stret
в зависимости от того, является ли методподпись имеет тип возврата struct
или нет.(Запомните разницу между селектором (просто именем с двоеточиями в нем, но без типов) и сигнатурой (типами) метода.) Поэтому необходимо предупредить, потому что он может вызывать неправильную функцию, если неНе знаю.
Однако, просто получив селектор (@selector(...)
), ему не нужно знать типы.Селектор - это просто имя, и вы указали имя.Это все о том, для чего вы используете селектор.Если вы используете его в performSelector:
, ему также не нужно знать типы, потому что этот метод работает только для методов с аргументами и возвращает типы объектов, поэтому нет никакой двусмысленности.Следовательно, нет необходимости в предупреждении.