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.