Equivalente del metodo di class di -respondsToSelector:

Esiste un metodo di class equivalente a -respondsToSelector:

Qualcosa come +respondsToSelector:

Il motivo per cui lo chiedo è perché implementando -respondsToSelector: a livello di class, viene visualizzato un avviso del compilatore: “found ‘-respondsToSelector:’ invece di ‘+ respondsToSelector:’ in protocol (s)”.

Il codice si presenta così:

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

Aggiorna dopo aver visto la tua modifica:

Un object di class risponde a respondsToSelector: bene, come probabilmente saprai. In un’applicazione di test, posso eseguire entrambe le seguenti operazioni senza avvisi del compilatore:

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

Tuttavia, hai dichiarato un protocollo sulla tua variabile, quindi presume che l’object di class che stai indicando implementa questi metodi. La soluzione più semplice sarebbe cast someClass come id allo scopo di chiamare respondsToSelector: Una soluzione un po ‘più pulita sarebbe dichiarare il proprio @protocol che dichiara +respondsToSelector:(SEL)selector , e quindi dichiara someClass come segue:

 Class someClass = ... 

Infine, assicurati di segnalare un bug con Apple all’indirizzo http://bugreporter.apple.com . Includere una semplice applicazione di test in modo che sia chiaro cosa stai facendo. Accolgono con favore tali segnalazioni di bug, anche se sono state inoltrate in passato, in quanto li aiuta a dare la priorità alle correzioni.

Nota finale: questo probabilmente sta accadendo perché in teoria, avresti potuto scegliere di implementare un object radice completamente separato da NSObject, e in quel caso, non avrebbe risposto a -respondsToSelector: -[NSObject respondsToSelector:] è effettivamente dichiarato nel protocollo NSObject , non nella definizione della class. Il protocollo NSObject è in realtà dove la maggior parte di ciò che conosci come NSObject effettivamente vive. Si potrebbe sostenere che +respondsToSelector: dovrebbe essere anche lì, ma al momento non lo è. E dal momento che hai fornito un elenco di protocolli e il metodo non è lì, ti dà un avvertimento per assicurarti di sapere cosa stai facendo.

Beh, un metodo di class è solo un metodo dell’object di class, quindi dovresti essere in grado di farlo

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

È ansible utilizzare le seguenti instancesRespondToSelector: da iOS 2.0, quindi dove è ansible eseguire un’istanza di una class;

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

Con una class che puoi usare

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

Quale si comporta come +(BOOL) respondsToSelector

Quello che penso stavi chiedendo è: puoi chiedere a una class se risponde a +someMethod o no? In altre parole, pensando alle API Cocoa Touch, vorresti:

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

Ma quello che ho scritto sopra non funziona come desiderato. respondsToSelector: riguarda solo i metodi di istanza. (Quindi entrambe le chiamate restituiranno NO.) All’interno delle API Cocoa non esiste un equivalente a respondsToSelector: per una class.

Tuttavia, class_getClassMethod chiamare class_getClassMethod . Se il risultato è non NULL, il metodo di class che stai chiedendo è presente e puoi chiamarlo.

In Objective C, le classi sono anche oggetti in modo da poter inviare i messaggi object. In particolare, puoi chiedere -respondsToSelector: di una class. Non si possono però inviare metodi di livello di class ad oggetti non di class.