Objetivo C: Dado un id de clase, ¿puedo comprobar si esta clase implementa un protocolo determinado? ¿O tiene cierto selector?


Quiero usar esto para una fábrica de objetos: Dada una cadena, crear una Clase, y si esta clase soporta un protocolo (con un método Create ()) luego asigna la clase y llama Crear.

Author: BJ Homer, 2010-02-26

2 answers

Class klass = NSClassFromString(classname);
if ([klass instancesRespondToSelector:@selector(create)]) {
  [[klass alloc] create];
}

¿Puedo, sin embargo, señalar cuántas horribles reglas de Objective-C estás rompiendo al hacer lo anterior? Por ejemplo, nunca debe llamar a métodos en una instancia asignada pero no inicializada. El analizador estático Xcode le dará todo tipo de advertencias sobre fugas de memoria.

Una mejor opción sería esta:

[[[klass alloc] init] create];

Pero parece que insinúas que no quieres llamar a init.

Podría considerar un método de clase: [klass create], que devolvería un no poseído instancia de klass. Entonces solo tienes que comprobar [klass respondsToSelector:@selector(create)] antes de llamarlo.

 15
Author: BJ Homer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-28 07:13:05
NSString *className; //assume this exists
Class class = NSClassFromString(className);
if ([class conformsToProtocol:@protocol(SomeProtocol)]) {
    id instance = [[class alloc] init];
    [instance create];
}
 258
Author: Chuck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-26 20:59:12