Objetivo C: Dado um ID da classe, posso verificar se esta classe implementa um determinado protocolo? Ou tem um certo seletor?
-
23-09-2019 - |
Pergunta
Quero usar isso para uma fábrica de objetos: dada uma string, crie uma classe e se esta classe suportar um protocolo (com um método create ()), alocem a classe e a chamada Crie.
Solução
Class klass = NSClassFromString(classname);
if ([klass instancesRespondToSelector:@selector(create)]) {
[[klass alloc] create];
}
Posso, no entanto, apontar quantas regras terríveis do Objective-C que você está quebrando fazendo o acima? Por exemplo, você nunca deve ligar para os métodos em uma instância alocada, mas não inicializada. O analisador estático Xcode fornecerá todos os tipos de avisos sobre vazamentos de memória.
Uma opção melhor seria a seguinte:
[[[klass alloc] init] create];
Mas você parece sugerir que você não quer ligar para o init.
Você pode considerar um método de classe: [klass create]
, que retornaria uma instância não pertencente a klass
. Então você acabou de verificar [klass respondsToSelector:@selector(create)]
antes de chamá -lo.
Outras dicas
NSString *className; //assume this exists
Class class = NSClassFromString(className);
if ([class conformsToProtocol:@protocol(SomeProtocol)]) {
id instance = [[class alloc] init];
[instance create];
}