2011-09-01 17 views

Respuesta

9

Uso

[self performSelector:method]; 

En lugar de

[self method]; 

Y

[self performSelector:method withObject:dict]; 

En lugar de obras respuesta

[self method:dict]; 
+0

Impresionante. ¡En verdad resolviste mi próximo problema! Estaba fallando en [self method], y ahora sé por qué. Ojalá pudiera darle más puntos :) –

+0

Gracias Joris, siempre dispuesto a ayudar. – sidyll

3

de sidyll, pero hay una solución mejor.

En general, usted declarar un protocolo:

@protocol MyOptionalMethods 
@optional 
- (void)method:(NSDictionary*)dict; 
@end 

y declare que su objeto es conforme al protocolo:

id<MyOptionalMethods> foo; 
UIView*<MyOptionalMethods> bar; // it'll be a subclass o' UIView and may implement pro to 

A continuación, comprobar:

if ([foo respondsToSelector:@selector(method:)]) 
    [foo method: dict]; 

De esta manera, el compilador tiene la oportunidad de escribir completamente todos los argumentos. Además, este patrón no está limitado a métodos que no toman argumentos ni un solo argumento de objeto.

Además, esto está a prueba de futuro contra la migración a ARC (ya que ARC se queja con razón de la fragilidad de performSelector :).

+0

Desafortunadamente, esto no funciona con los nombres de métodos variables. –

+1

Eso es correcto, pero, por lo general, los nombres de métodos variables son un signo de un diseño deficiente. No siempre, ciertamente. – bbum

Cuestiones relacionadas