8
votes

Y a-t-il une méthode introspection pour obtenir tous les protocoles d'adoption d'une classe dans l'objectif-C?

Il y a un - [NsObject ConformsProtocol:] pour vérifier si un protocole spécifique est adopté ou non. Existe-t-il une méthode pour obtenir tous les protocoles d'adoption d'une classe plutôt que de vérifier une liste?


2 commentaires

Qu'est-ce que vous essayez exactement d'accomplir cela?


@ RICHARDJ.ROSSIII J'ai souvent utilisé la conformité du protocole où j'ai besoin d'un objet général pour pouvoir choisir puis expédier des travaux sur une cible appropriée (par exemple, un utableviewatasource pour pouvoir choisir une cellule pour un objet donné, puis définissez cet objet); Je juge que c'est plus maintenu et nécessite moins de redéclaration pour le répartiteur pour trouver des objectifs appropriés via le temps d'exécution, puis les interroger sur ce qu'ils attendent. Des pensées sur ce modèle?


3 Réponses :


2
votes

Vous pouvez essayer objc_copyprotocolliste

I.e. Vous obtenez la liste de tous les protocoles, puis vérifiez si l'objet actuel est conforme à un protocole spécifique en itérant la liste.

EDIT:

La solution H2CO3 est vraiment meilleure une


3 commentaires

Ou class_copyprotocolliste () .


Comment l'utiliser pratiquement?


Je ne pense pas que objc_copyprotocollist () est la bonne option ici - qui obtient tous les protocoles que existez , n'importe où. class_copyprotocolliste () vous dit quels protocoles une classe déclare être conforme à la conformité.



12
votes

Il y a une solution plus élégante: class_copyprotocolliste () directement renvoie les protocoles adoptifs d'une classe. Utilisation: xxx


4 commentaires

Il ne faut que garder à l'esprit que cette liste ne contient pas les protocoles adoptés par les superclasses. Selon la manière dont cette liste est utilisée pour - il pourrait être nécessaire de monter la chaîne de superclassement et d'appeler la classe_copyprotocolliste ().


@Martinr Exactement, exactement, j'avais eu du mal à comprendre pourquoi cela n'a pas répertorié de protocoles pour Nsmutabledictionner (code> ...


C'est une bonne réponse. Sa bonne finesse. Cela pourrait ne pas fonctionner avec l'arc. Mais cela fonctionnera avec des non-arcs à coup sûr. Merci.


Si vous essayez de Obtenir ceci pour travailler avec Arc et obtenir une erreur de compilation, il suffit d'ajouter __ dangereux_unéré juste avant protocole ** p l.



3
votes

Il y a exactement NsObject + ConformeSoprotocol ; La conformité du protocole est déclarée dans le cadre du @interface de sorte qu'il n'est pas spécifique à chaque instance. Donc, e.g. xxx

pas besoin de descendre aux méthodes d'exécution du niveau C du tout, au moins pour la première limbe de votre question. Il n'y a rien dans NsObject pour obtenir une liste de protocoles pris en charge.


0 commentaires