2010-10-15 11 views
16

Quelle est la différence entre une méthode privée et une interface privée? Par exemple, je sais que si vous définissez une méthode dans une implémentation et que son interface ne la mentionne pas, elle est considérée comme une méthode privée. J'ai également vu des choses telles que:Interface privée ou méthode privée - objectif c

@interface Collector() 
@property (readonly) NSMutableDictionary *count; 
@end 

À l'intérieur du fichier d'implémentation .m.

Répondre

20

@interface Foo() crée une extension de classe (I stand corrigé, props to bbum) sur l'interface Foo qui est comme des méthodes supplémentaires ajoutées à l'interface. Certaines personnes utilisent également @interafce Foo(Private) (catégorie) au lieu d'une extension de classe avec (). C'est plus comme "injecter" de nouvelles méthodes dans une classe de l'extérieur de la classe. Le placer dans le fichier .m garde juste d'autres choses de "le voir" dans le fichier .h, mais c'est tout. Fondamentalement, les gens utilisent normalement des catégories ou des extensions de classe dans les fichiers .m pour spécifier des interfaces privées, mais ils sont également utilisés pour des choses comme UIKit utilise des catégories pour ajouter des méthodes publiques row et section à NSIndexPath. (Cela peut être déroutant.)

Vous n'avez pas vraiment besoin de définir des méthodes privées de cette façon, mais si vous avez une méthode appelée barre qui appelle la méthode foo avant que foo soit définie dans le fichier source, vous obtiendrez un compilateur avertissement quelque chose comme "l'objet soi peut ne pas répondre à foo". Vous pouvez vous en débarrasser en définissant foo avant de définir bar ou tout autre code foo-calling. C'est la même chose avec le C et les fonctions. Comme Ole dit que cela n'empêche personne d'appeler les méthodes privées, il déclare simplement votre intention qu'elles sont privées et amène le compilateur à générer les avertissements "may not reply to" même s'ils importent le fichier .h .

EDIT

Voir aussi http://www.friday.com/bbum/2009/09/11/class-extensions-explained/ pour une explication des catégories par rapport aux extensions de classe. On dirait que les extensions de classe devraient être plus correctes pour définir des méthodes privées, du point de vue de l'avertissement du compilateur, car les méthodes de catégorie sont facultatives. J'aimerais que mon livre m'explique cela!

+8

Il existe une énorme différence entre les catégories nommées '(foo)' et une extension de classe '()'. – bbum

+0

Avez-vous une référence à cela? Je ne vois rien dans le livre "Programming in Objective-C 2.0" à ce sujet. Il semble que le nom de la catégorie est juste facultatif de tout ce que je peux dire. Pas que je sois un expert majeur ou quoi que ce soit mais il serait utile que vous fournissiez un lien expliquant la différence entre (Privé) et(). – Nimrod

+0

nevermind, il me semble avoir trouvé votre blog http://www.friday.com/bbum/2009/09/11/class-extensions-explained/ Je me demande pourquoi mon livre ne parle pas de ça? – Nimrod

17

Objective-C n'a pas de méthodes totalement privées. La méthode déclarée dans une section d'interface privée dans le fichier .m est invisible aux appelants externes mais elle n'est pas privée. Si quelqu'un connaît la signature de la méthode et ignore l'avertissement du compilateur, il peut l'appeler de l'extérieur sans problème.