Objetivo C: Dado um ID da classe, posso verificar se esta classe implementa um determinado protocolo? Ou tem um certo seletor?

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

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.

Foi útil?

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];
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top