¿Por qué Xcode no se queja de los methods no declarados cuando usa @selector?

¿Por qué se generan advertencias al llamar methods no declarados en una interfaz de class usando medios convencionales, pero no cuando se llaman methods usando @selector? ¿Es porque los selectores pueden ser ejecutados por una persona que llama diferente que yo?

Por ejemplo:

-(void) doStuff { [self doNow]; // Warning: instance method not found SEL sel = @selector(doNow); // no warnings } -(void) doNow {} // this method is not declanetworking in the interface 

La advertencia "Selector no declarado" está desactivada de manera pnetworkingeterminada. No sé por qué. Puede volver a activarlo en la configuration de compilation.

La documentation de esta configuration dice:

Advierta si se encuentra una expresión "@selector (…)" que hace reference a un selector no declarado. Un selector se considera no declarado si no se ha declarado ningún método con ese nombre antes de la expresión "@selector (…)", explícitamente en una @interface o en la statement @protocol, o implícitamente en una sección de @implementation. Esta opción siempre realiza sus comprobaciones tan pronto como se encuentra una expresión "@selector (…)", mientras que -Wselector solo realiza sus comprobaciones en la etapa final de la compilation. Esto también aplica la convención de coding style de que los methods y selectores deben declararse antes de ser utilizados. [GCC_WARN_UNDECLARED_SELECTOR, -Wundeclanetworking-selector]

Se hizo una pregunta similar sobre SO hace algunas semanas.

Esto se debe básicamente a que los selectores están encriptados tarde. No son buscados hasta el time de ejecución. Hay opciones para forzar la verificación durante la compilation. La pregunta a la que he conectado tiene más información sobre cómo puedes hacerlo.

La forma en que @selector funciona por defecto es que le está diciendo al comstackdor; confía en mí, tengo este método en algún lugar de mi class. Es el mismo concepto si haces @class yourclassname en lugar de importar el file .h que contiene la class.

Esto se debe a que el comstackdor necesita saber la firma del método para llamarlo (es decir, [self doNow]; ), ya que dicha llamada se traduce a una llamada a objc_msgSend u objc_msgSend_stret dependiendo de si la firma del método tiene un tipo de retorno de una struct o no. (Recuerde la diferencia entre el selector (simplemente el nombre con los dos puntos en él, pero sin ningún tipo) y la firma (los types) de un método). Por lo tanto, debe advertir porque podría llamar a la function incorrecta si no lo hace no lo sé

Sin embargo, solo get un selector ( @selector(...) ), no necesita saber los types. El selector es simplemente un nombre y has proporcionado el nombre. Se trata de para qué usas el selector. Si lo usa en performSelector: tampoco necesita conocer los types, ya que ese método solo funciona para methods con argumento y para devolver types de objects, por lo que no hay ambigüedad. Por lo tanto, no hay necesidad de una advertencia.