Obiettivo C: Dato un ID classe, posso verificare se questa classe implementa un certo protocollo? O ha un certo selettore?

StackOverflow https://stackoverflow.com/questions/2344672

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.

È stato utile?

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];
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top