Question

Ma compréhension est que les protocoles sont comme des interfaces dans d'autres langues - ils déclarent les méthodes attendues - (. Peut-être même types que vous ne possédez pas), alors que les catégories vous permettent d'ajouter de nouvelles méthodes pour les types existants

Pourquoi, alors, ne l'iPhone SDK utilisent parfois des catégories pour déclarer les types de délégué? Normalement, je pense à tous les délégués d'être id tapé mais il y a beaucoup d'exemples où ce n'est pas le cas.

Par exemple, voir NSURLConnection. Son délégué est saisi « id » et le « contrat » est déclarée comme une catégorie sur NSObject (NSURLConnectionDelegate).

: quelle est la motivation pour l'utilisation de catégories dans ces cas

Était-ce utile?

La solution

Objective-C 2.0 introduit la directive protocole @optional, vous permettant de déclarer certaines méthodes de protocole à option. Avant Obj-C 2.0, les catégories ont été utilisées pour permettre des méthodes de délégués en option (en particulier, les catégories sur NSObject, qui sont appelés protocoles informels ).

Je suppose que la plupart de la catégorie au lieu-de-protocole utilisé dans le SDK iPhone est un vestige de l'équivalent des classes Mac. Par exemple, NSURLConnection existe dans le Mac et l'iPhone SDKs, de sorte que le code est probablement partagé. Depuis qu'Apple n'a pas encore passé par changer toutes les classes de Mac d'utiliser des protocoles officiels, nous nous retrouvons avec un peu d'incohérence.

Autres conseils

Jusqu'à la révision de l'objectif-C qui a été déployé avec OS X 10.5 et l'iPhone SDK, appelé « Objective-C 2.0 », on ne pouvait faire des protocoles facultatifs à l'aide des catégories. Dans Objective-C 2.0, un nouveau mot-clé @optional a été ajouté dans les protocoles pour marquer les méthodes étaient facultatives (le reste est implicitement nécessaire).

Je pense que ce que vous voyez est une légère mise en réserve des jours plus tôt, avant le mot-clé @optional.

Edit: Pour répondre au suivi qui est apparu dans la question initiale: La motivation pour utiliser une catégorie sur NSObject / id pour un protocole informel est en partie à documenter et groupe les méthodes de l'objet peut faire appel à son point d'émission (ou son délégué ou autre), et à un degré moindre pour éviter les avertissements du compilateur que vous appelez des méthodes que le compilateur ne connaît pas sera présent dans l'objet qui reçoit l'appel. Imaginez que vous êtes le seul à mettre en œuvre la classe qui appelle ces méthodes de DataSource - vous auriez probablement eu envie de vérifier que la méthode est présente en utilisant [obj respondsToSelector: @selector (mon: source de données: méthode :)] chaque fois que vous êtes intéressé à appeler la ma : source de données: méthode:. procédé de l'objet obj

C'est un héritage venu de c-objectif 1.0, qui n'a pas « méthode de protocole facultatif ».

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top