versiones guia español descargar actualizar objective-c selector categories

objective-c - guia - qgis manual



Cómo deshacerse de la advertencia de ''selector no declarado'' (11)

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() :

SEL setErrorSelector = sel_registerName("setError:"); if([self respondsToSelector:setErrorSelector]) { [self performSelector:setErrorSelector withObject:[NSError errorWithDomain:@"SomeDomain" code:1 userInfo:nil]]; }

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 debe establecer una propiedad de error si la instancia de NSObject a la que se llama es compatible. 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 el setError: signature, por lo que me da una advertencia para cada línea que contiene el @selector(setError:) :

Undeclared selector ''setError:''

No quiero tener que declarar un protocolo para deshacerme de esta advertencia, porque no quiero que todas las clases que puedan usar esto implementen algo especial. Solo por convención quiero que tengan un método o propiedad setError: .

¿Es esto factible? ¿Cómo?

Aclamaciones,
EP


Eche un vistazo a NSSelectorFromString .

SEL selector = NSSelectorFromString(@"setError:"); if ([self respondsToSelector:selector])

Le permitirá crear un selector en tiempo de ejecución, en lugar de hacerlo en tiempo de compilación mediante la palabra clave @selector , y el compilador no tendrá ninguna posibilidad de quejarse.


Me doy cuenta de que llegué un poco tarde a este hilo pero, para completar, puedes desactivar esta advertencia globalmente usando la configuración de compilación de destino.

En la sección, "Advertencias LLVM de Apple - Objetivo-C", cambie:

Undeclared Selector - NO


Otra opción sería desactivar la advertencia con:

#pragma GCC diagnostic ignored "-Wundeclared-selector"

Puede colocar esta línea en el archivo .m donde ocurre la advertencia.

Actualizar:

Funciona también con LLVM así:

#pragma clang diagnostic push #pragma clang diagnostic ignored "-Wundeclared-selector" ... your code here ... #pragma clang diagnostic pop


Pude obtener la advertencia para que se fuera agregando el método de continuación (divulgación: no pensé en esto, pero lo encontré buscando en Google en el temporizador programado con intervalo de tiempo)

[NSTimer scheduledTimerWithTimeInterval:[[NSDate distantFuture] timeIntervalSinceNow] target:self selector:@selector(donothingatall:) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] run]; HTTPLogVerbose(@"%@: BonjourThread: Aborted", THIS_FILE); } } + (void) donothingatall:(NSTimer *)timer { }

Aunque aprecio saber cómo ocultar la advertencia, arreglarla es mejor y ni las técnicas de Sergio ni Relkin me funcionaron, por razones desconocidas.


Puedes desactivarlo en Xcode como en la captura de pantalla:


Recibí ese mensaje para que se vaya al # incluir el archivo con el método. Nada más fue usado desde ese archivo.


Si bien es probable que la respuesta correcta radique en informar a Xcode a través de las importaciones o registrar el selector de que existe dicho selector, 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. Encontré el error en el ejemplo de MVCNetworking de Apple, por ejemplo.


Si su clase implementa el método setError: (incluso al declarar el setter dinámico de la propiedad de error eventual), puede declararlo en su archivo de interfaz (.h), o si no desea mostrarlo de esa manera, podría prueba con el truco engañoso de PrivateMethods:

@interface Yourclass (PrivateMethods) - (void) yourMethod1; - (void) yourMethod2; @end

justo antes de su @implementación, esto debería ocultar las advertencias;).


También puede convertir el objeto en cuestión en una identificación primero para evitar la advertencia:

if ([object respondsToSelector:@selector(myMethod)]) { [(id)object myMethod]; }


Un macro realmente cómodo para poner en .pch o Common.h o donde quieras:

#define SUPPRESS_UNDECLARED_SELECTOR_LEAK_WARNING(code) / _Pragma("clang diagnostic push") / _Pragma("clang diagnostic ignored /"-Wundeclared-selector"/"") / code; / _Pragma("clang diagnostic pop") /

Es una edición de esta pregunta para un problema similar ...