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.
36
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
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
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