Quiero usar un selector en una instancia de NSObject sin la necesidad de un protocolo implementado. Por ejemplo, hay un método de categoría que debería establecer una propiedad de error si la instancia de NSObject en la que se invoca lo admite. Este es el código, y el código funciona según lo previsto:
if ([self respondsToSelector:@selector(setError:)])
{
[self performSelector:@selector(setError:) withObject:[NSError errorWithDomain:@"SomeDomain" code:1 userInfo:nil]];
}
Sin embargo, el compilador no ve ningún método con setError: signature, por lo que me da una advertencia, para cada línea que contiene el @selector(setError:)
fragmento:
Undeclared selector 'setError:'
No quiero tener que declarar un protocolo para deshacerme de esta advertencia, porque no quiero que todas las clases que pueden usar esto implementen algo especial. Solo por convención quiero que tengan un setError:
método o propiedad.
¿Es esto factible? ¿Cómo?
Saludos,
EP
objective-c
selector
categories
epologee
fuente
fuente
Respuestas:
Otra opción sería deshabilitar la advertencia con:
Puede colocar esta línea en el archivo .m donde se produce la advertencia.
Actualizar:
Funciona también con LLVM así:
fuente
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
// Do your thing
#pragma clang diagnostic pop
#pragma clang diagnostic ignored "-Wselector"
Echa un vistazo a NSSelectorFromString .
Le permitirá crear un selector en tiempo de ejecución, en lugar de en tiempo de compilación a través de la
@selector
palabra clave, y el compilador no tendrá ninguna posibilidad de quejarse.fuente
sel_registerName()
cosa parece oscura y del tipo que no deberías llamar directamente a menos que sepas lo que estás haciendo, como obj_msg_send ();)Creo que esto se debe a que por alguna extraña razón, el selector no está registrado en el tiempo de ejecución.
Intente registrar el selector a través de
sel_registerName()
:fuente
NSSelectorFromString
llamasel_registerName()
bajo el capó de todos modos. Elija el que más le convenga.sel_registerName()
directamente es más explícito sobre por qué lo estás haciendo.NSSelectorFromString
no te dice que va a intentar registrar el selector.Recibí ese mensaje para que desapareciera # incluyendo el archivo con el método. No se utilizó nada más de ese archivo.
fuente
Me doy cuenta de que llego un poco tarde a este hilo, pero para completar, puede desactivar esta advertencia globalmente utilizando la configuración de compilación de destino.
En la sección, 'Advertencias de Apple LLVM - Objetivo-C', cambie:
fuente
Si su clase implementa el método setError: (incluso declarando dinámicamente el establecedor de la propiedad de error eventual) es posible que desee declararlo en su archivo de interfaz (.h), o si no desea mostrarlo de esa manera, podría prueba con el truco complicado PrivateMethods:
justo antes de su @implementation, esto debería ocultar las advertencias;).
fuente
PerformSelector may cause a leak because its selector is unknown
Una macro muy cómodo para poner en su
.pch
oCommon.h
cualquier lugar al que desea:Es una edición de esta pregunta para un problema similar ...
fuente
Puede desactivarlo en Xcode como en la captura de pantalla:
fuente
También puede lanzar el objeto en cuestión a una identificación primero para evitar la advertencia:
fuente
Otra forma de evitar esta advertencia es asegurarse de que su método de selección tenga este aspecto:
No olvide "remitente (id)" si desea aceptar cualquier remitente o especificar un tipo de objeto de remitente si lo prefiere.
fuente
Si bien la respuesta correcta probablemente radica en informar a Xcode a través de las importaciones o registrar el selector que dicho selector existe, en mi caso me faltaba un punto y coma. Antes de "corregir" el error, asegúrese de que tal vez el error sea correcto y su código no lo sea. Encontré el error en la muestra MVCNetworking de Apple, por ejemplo.
fuente
Pude obtener la advertencia para que desapareciera agregando otro método (divulgación: no pensé en esto, pero lo encontré buscando en googlettimetimerwithtimeinterval)
Si bien aprecio saber cómo ocultar la advertencia, corregirla es mejor y ni las técnicas de Sergio ni de Relkin funcionaron para mí, por razones desconocidas.
fuente