Obiettivo C: Dato un ID classe, posso verificare se questa classe implementa un certo protocollo? O ha un certo selettore?
-
23-09-2019 - |
Domanda
Voglio usare questo per una fabbrica di oggetto: Data una stringa, creare una classe, e se Questa classe supporta un protocollo (con un metodo Create ()) allora Alloc la classe e la chiamata Crea.
Soluzione
Class klass = NSClassFromString(classname);
if ([klass instancesRespondToSelector:@selector(create)]) {
[[klass alloc] create];
}
Posso, però, sottolineare quante regole terribile Objective-C si sta rompendo facendo quanto sopra? Ad esempio, non si dovrebbe mai essere chiamata metodi su un'istanza allocato-ma-non-inizializzato. Il Xcode Static Analyzer vi darà tutti i tipi di avvertimenti sulle perdite di memoria.
Una soluzione migliore sarebbe questo:
[[[klass alloc] init] create];
Ma ti sembra implicare che non si desidera chiamare init.
Si potrebbe prendere in considerazione un metodo di classe: [klass create]
, che sarebbe tornato un'istanza non di proprietà di klass
. Poi si era appena controllare [klass respondsToSelector:@selector(create)]
prima di chiamare.
Altri suggerimenti
NSString *className; //assume this exists
Class class = NSClassFromString(className);
if ([class conformsToProtocol:@protocol(SomeProtocol)]) {
id instance = [[class alloc] init];
[instance create];
}