Método de class equivalente a -respondsToSelector:

Existe um método de class equivalente a -respondsToSelector: 😕

Algo como +respondsToSelector: 😕

A razão pela qual estou perguntando é porque implementando -respondsToSelector: em um nível de class, recebo um aviso do compilador: “found ‘-respondsToSelector:’ em vez de ‘+ respondsToSelector:’ em protocolo (s)”.

O código é assim:

 Class  someClass = [someInstance class]; if ([someClass respondsToSelector:@selector(someSelector:)]) { someVar = [someClass someSelector:someData]; } 

Atualize depois de ver sua edição:

Um object de class responde ao respondsToSelector: muito bem, como você provavelmente sabe. Em um aplicativo de teste, posso fazer as duas coisas a seguir sem nenhum aviso do compilador:

 NSLog(@"Responds to selector? %i", [MyObject respondsToSelector:@selector(respondsToSelector:)]); NSLog(@"Responds to selector? %i", [[MyObject class] respondsToSelector:@selector(respondsToSelector:)]); 

No entanto, você declarou um protocolo em sua variável, portanto, pressupõe que o object de class que você está apontando implemente esses methods. A solução mais simples seria converter someClass como um id com o propósito de chamar respondsToSelector: Uma solução um pouco mais limpa seria declarar seu próprio @protocol que declara o +respondsToSelector:(SEL)selector e, em seguida, declarar someClass seguinte forma:

 Class someClass = ... 

Por fim, lembre-se de registrar um bug na Apple em http://bugreporter.apple.com . Inclua um aplicativo de teste simples para que fique claro o que você está fazendo. Eles recebem bem esses relatórios de bugs, mesmo que tenham sido enviados no passado, pois os ajuda a priorizar as correções.

Nota final: isso provavelmente está acontecendo porque, em teoria, você poderia ter escolhido implementar um object raiz totalmente separado do NSObject e, nesse caso, ele não responderia ao -respondsToSelector: -[NSObject respondsToSelector:] é realmente declarado no protocolo NSObject , não a definição de class. O protocolo NSObject é onde a maioria do que você conhece como NSObject realmente vive. Alguém poderia argumentar que +respondsToSelector: também deveria estar lá, mas a partir de agora, não é. E desde que você forneceu uma lista de protocolos, e o método não está lá, você recebe um aviso para ter certeza de que sabe o que está fazendo.

Bem, um método de class é apenas um método do object de class, então você deve ser capaz de fazer isso

 [MyClass respondsToSelector:@selector(...)] 

Você pode usar as seguintes instancesRespondToSelector: desde o iOS 2.0, portanto, onde com uma instância de uma class você pode fazer;

 [myInstance respondsToSelector: @selector(...)]; 

Com uma aula você pode usar

 [myClass instanceRespondsToSelector: @selector(...)]; // or [[myInstance class] instanceRespondsToSelector: @selector(...)]; 

Que se comportará como +(BOOL) respondsToSelector

O que eu acho que você estava perguntando é: você pode perguntar a uma turma se ela responde a +someMethod ou não? Em outras palavras, pensando nas APIs Cocoa Touch, você gostaria de:

 [ [ UIView class ] respondsToSelector: @selector( buttonWithType: ) ] -> NO [ [ UIButton class ] respondsToSelector: @selector( buttonWithType: ) ] -> YES 

Mas o que escrevi acima não funciona como desejado. respondsToSelector: é apenas sobre methods de instância. (Assim, ambas as chamadas retornarão NO.) Dentro das APIs do Cocoa não há equivalente para respondsToSelector: para uma class.

Você pode, no entanto, chamar class_getClassMethod . Se o resultado for não-NULL, o método de class sobre o qual você está perguntando está presente e você pode chamá-lo.

No Objetivo C, as classs também são objects para que você possa enviar as mensagens do object. Em particular, você pode pedir -respondsToSelector: de uma class. Você não pode enviar methods de nível de class para objects que não sejam de class.