objective-c - libro - para que se utiliza objective c
Objetivo C: dada una identificación de clase, ¿puedo verificar si esta clase implementa un determinado protocolo? O tiene un cierto selector? (2)
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 Xcode Static Analyzer le dará todo tipo de advertencias sobre fugas de memoria.
Una mejor opción sería esta:
[[[klass alloc] init] create];
Pero pareces dar a entender que no quieres llamar a init.
Podría considerar un método de clase: [klass create]
, que devolvería una instancia no propiedad de klass
. Luego, simplemente verifica [klass respondsToSelector:@selector(create)]
antes de llamarlo.
Quiero usar esto para una fábrica de objetos: Dada una cadena, crea una Clase, y si esta Clase admite un protocolo (con un método Create ()), entonces asigna la clase y llama a Crear.
NSString *className; //assume this exists
Class class = NSClassFromString(className);
if ([class conformsToProtocol:@protocol(SomeProtocol)]) {
id instance = [[class alloc] init];
[instance create];
}