2010-03-02 6 views
6

Tengo una clase que usa resolveInstanceMethod para implementar métodos dinámicamente. Cuando llamo a los métodos implementados dinámicamente desde otras partes del código, el compilador emite una advertencia de que el objeto puede no responder al selector. Me gustaría que el compilador no emita tales advertencias para esta clase, pero no quiero suprimir las advertencias cuando invoco un selector no válido en otras clases. es posible?¿Cómo puedo decirle al compilador que mi clase resuelve los métodos dinámicamente?

Respuesta

7

asumiendo que conoce las firmas de los métodos que se van a resolver de forma dinámica en tiempo de compilación, se puede declarar 'em en una categoría informal:

@interface MyDynamicallyResolvingClass(MethodsThatWillResolveAtRuntime) 
... declare the methods here ... 
@end 

No hay necesidad de proporcionar una implementación.

Si no conoce las firmas, si los nombres de los métodos también son dinámicos, necesitará usar -performSelector: (o las variantes de argumento de objeto simple o doble) o es probable que desee utilizar NSInvocación, a menos que el rendimiento sea una preocupación importante (si es así, hay soluciones alternativas que son significativamente más complicadas).

+0

Un protocolo informal resuelve mi problema perfectamente. –

4

Uso performSelector:

Es equivalente a enviar un mensaje directamente al receptor, sin embargo, que le permite enviar mensajes que no están determinados, hasta el tiempo de ejecución.

Si sus métodos toman uno o dos argumentos, puede utilizar las hermanas de este método: – performSelector:withObject: y – performSelector:withObject:withObject:

Si sus métodos tienen más de dos argumentos, o argumentos que no son del tipo de objeto, esta respuesta es no adaptado

+0

Eso funciona solo para los métodos que toman 0, 1 o 2 argumentos de tipo de objeto. – bbum

+0

De hecho. Editó la respuesta para aclarar esta limitación. – Guillaume

Cuestiones relacionadas