Meilleure façon de définir les méthodes privées pour une classe Objective-C
Je viens de commencer la programmation en Objective-C et, ayant un arrière-plan en Java, me demande comment les gens de l'écriture Objective-C programmes traitent des méthodes privées.
Je comprends il peut y avoir plusieurs conventions et habitudes et de réfléchir à cette question comme un agrégateur de les meilleures techniques d'utilisation de personnes traitant avec les méthodes privées en Objective-C.
Veuillez inclure un argument pour votre approche lors de la publication. Pourquoi est-il bon? Qui les inconvénients-t-il (que vous connaissez) et comment vous devez traiter avec eux?
Comme pour mes résultats jusqu'à présent.
Il est possible d'utiliser catégories [par exemple: Maclasse (Privé)] définie dans Maclasse.m fichier de groupe de méthodes privées.
Cette approche a 2 problèmes:
- Xcode (et le compilateur?) ne pas cocher si vous définir toutes les méthodes, en privé, de la catégorie correspondante @mise en œuvre de bloc
- Vous devez mettre @interface de déclarer votre catégorie dans le début de MyClass.m fichier, sinon Xcode se plaint avec un message comme "auto peut ne pas répondre à un message "privateFoo".
Le premier problème peut être contourné avec catégorie vide [par exemple: Maclasse ()].
Le second qui me dérange beaucoup. J'aimerais voir privé, les méthodes de mise en œuvre (et définie), à proximité de la fin du fichier, je ne sais pas si c'est possible.
- Des gens pourraient trouver cette question intéressante: stackoverflow.com/questions/2158660/...
- Pourquoi ne pas simplement les laisse-le en dehors de la déclaration de la méthode privée?
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas, comme d'autres l'ont déjà dit, une telle chose comme une méthode privée en Objective-C. Toutefois, en Objective-C 2.0 (sens de Mac OS X Leopard, iPhone OS 2.0, et plus tard), vous pouvez créer une catégorie avec un nom vide (c'est à dire
@interface MyClass ()
) appelé Extension de Classe. Ce qui est unique au sujet d'une extension de classe, c'est que la méthode implémentations doivent aller dans la même@implementation MyClass
que les méthodes publiques. Donc, je structure mes classes comme ceci:Dans le .h fichier:
Et dans le .m fichier:
Je pense que le plus grand avantage de cette approche est qu'il vous permet de regrouper votre méthode de mise en œuvre grâce à la fonctionnalité, et non pas par la (parfois arbitraire) distinction public/privé.
if (bSizeDifference && [self isSizeDifferenceSignificant:fWidthCombined])...
Puis fWidthCombined était toujours à venir à travers comme 0.Il n'est pas vraiment une "méthode" en Objective-C, si le moteur d'exécution peuvent travailler sur la mise en œuvre de l'utilisation qu'il va faire. Mais cela ne veut pas dire qu'il n'y a pas de méthodes qui ne font pas partie de la documentation de l'interface. Pour ces méthodes, je pense qu'une catégorie est très bien. Plutôt que de mettre le
@interface
en haut de l' .m fichier comme votre point 2, je l'avais mis dans son propre .h fichier. Une convention que j'ai suivi (et qui en ont vu d'ailleurs, je pense que c'est une Pomme convention de Xcode offre désormais une prise en charge automatique) est le nom d'un tel fichier après sa catégorie et de catégorie a + de la séparation, de sorte@interface GLObject (PrivateMethods)
peut être trouvé dansGLObject+PrivateMethods.h
. La raison de l'en-tête de fichier est de sorte que vous pouvez l'importer dans votre unité de classes de test :-).Par la façon dont, dans la mesure de mise en œuvre/définition des méthodes de près de la fin de la .m fichier est concerné, vous pouvez le faire avec une catégorie par la mise en œuvre de la catégorie en bas de la .m fichier:
ou avec une extension de classe (la chose que vous appelez une "catégorie vide"), il suffit de définir ces méthodes dernier. Objective-C méthodes peuvent être définis et utilisés dans n'importe quel ordre dans la mise en œuvre, donc il n'y a rien pour vous empêcher de vous mettre le "privé" des méthodes à la fin du fichier.
Même avec les extensions de la classe, je vais souvent créer un en-tête (
GLObject+Extension.h
) afin que je puisse utiliser ces méthodes si nécessaire, imitant "ami" ou "protégé" de la visibilité.Depuis cette réponse a été écrit à l'origine, le compilateur clang a commencé à faire deux passes pour Objective-C méthodes. Cela signifie que vous pouvez éviter de déclarer votre "privé" méthodes complètement, et qu'ils soient au-dessus ou au-dessous de la vocation du site, ils vont être trouvée par le compilateur.
Alors que je ne suis pas Objective-C expert, personnellement, je vient de définir la méthode de la mise en œuvre de ma classe. Accordé, il doit être défini avant (ci-dessus) toutes les méthodes de l'appeler, mais il prend définitivement le moins de travail à faire.
La définition de vos méthodes privées dans le
@implementation
bloc est idéal pour la plupart des besoins. Clang va voir à l'intérieur de la@implementation
, indépendamment de leur ordre de déclaration. Il n'est pas nécessaire de les déclarer dans une classe de continuation (aka extension de classe) ou le nom de la catégorie.Dans certains cas, vous aurez besoin de déclarer la méthode dans la classe de poursuite (par exemple, si vous utilisez le sélecteur entre la classe de la poursuite et de la
@implementation
).static
fonctions sont très bon pour la particulièrement sensibles ou de la vitesse critique des méthodes privées.Une convention pour nommer les préfixes peuvent vous aider à éviter accidentellement prépondérant méthodes (je trouve le nom de la classe comme un préfixe de sécurité).
Nommé catégories (par exemple,
@interface MONObject (PrivateStuff)
) ne sont pas une très bonne idée à cause des conflits de noms lors du chargement. Ils sont vraiment utile pour un ami ou protégés des méthodes (qui sont très rarement un bon choix). Pour vous assurer que vous êtes averti du caractère incomplet de la catégorie des implémentations, en fait, vous devez la mettre en œuvre:Voici un petit annoté feuille de triche:
MONObject.h
MONObject.m
Une autre approche qui ne peut pas être évident: d'un C++ de type peut être à la fois très rapide et fournir un degré beaucoup plus élevé de contrôle, tout en minimisant le nombre de exportés et chargé objc méthodes.
Vous pouvez essayer de définir une fonction statique au-dessous ou au-dessus de votre mise en œuvre qui prend un pointeur de votre instance. Il sera en mesure d'accéder à vos instances de variables.
Vous pouvez utiliser des blocs?
Je suis conscient que c'est une vieille question, mais c'est un des premiers que j'ai découvert lorsque j'étais à la recherche d'une réponse à cette question. Je n'ai pas vu cette solution discuté nulle part ailleurs, alors laissez-moi savoir si il y a quelque chose de stupide à ce sujet.
static
). Mais j'ai fait des expériences avec l'attribution de blocs de privé ivars (à partir de la méthode init) — un peu de JavaScript-style — qui permet aussi un accès privé ivars, quelque chose de pas possible à partir des fonctions statiques. Pas encore sûr que je préfère.tous les objets Objective-C sont conformes à NSObject protocole, qui tient sur le performSelector: méthode. J'ai aussi été précédemment vous cherchez une façon de créer un peu de "helper ou privé, à des méthodes que je n'ai pas besoin exposés au niveau public. Si vous souhaitez créer une méthode privée avec pas de frais généraux et de ne pas avoir à le définir dans le fichier d'en-tête, puis donner un coup de cette...
définir votre méthode avec une même signature que le code ci-dessous...
ensuite, lorsque vous avez besoin de faire référence à la méthode de simplement appeler comme un sélecteur...
cette ligne de code appelle la méthode que vous avez créé et ne pas avoir une fâcheuse avertissement au sujet de ne pas l'avoir définie dans le fichier d'en-tête.
Si vous avez voulu éviter la
@interface
bloc en haut, vous pouvez toujours mettre le privé déclarations dans un autre fichierMyClassPrivate.h
pas l'idéal mais ce n'est pas encombrer la mise en œuvre.MyClass.h
MyClassPrivate.h
MyClass.m
Encore une chose que je n'ai pas vu mentionné ici - Xcode prend en charge .h les fichiers avec "_private" dans le nom. Disons que vous avez une classe Maclasse - vous avez MyClass.m et MyClass.h et maintenant, vous pouvez également avoir MyClass_private.h. Xcode va le reconnaître et de l'inclure dans la liste des "Homologues" dans l'Assistant de l'Éditeur.
Il n'y a aucun moyen de se déplacer à la question 2. C'est juste la façon dont le compilateur C (et donc de l'Objective-C compilateur) de travail. Si vous utilisez le XCode éditeur, la fonction popup devrait rendre facile pour naviguer dans le
@interface
et@implementation
blocs dans le fichier.Il est dans l'intérêt des méthodes privées absence. Vous pouvez déplacer la logique que vous avez l'intention de cacher à la classe et de l'utiliser en tant que délégué. Dans ce cas, vous pouvez marquer délégué de l'objet en tant que privé, et il ne sera pas visible de l'extérieur. Le déplacement de la logique de la classe à part (peut-être plusieurs) permet d'optimiser la conception de votre projet. La Cause de vos classes deviennent plus simples et vos méthodes sont regroupées dans les classes avec les noms propres.
Que d'autres personnes, a déclaré la définition des méthodes privées dans le
@implementation
bloc est OK pour la plupart des besoins.Sur le thème de la code de l'organisation - je tiens à les garder sous
pragma mark private
pour faciliter la navigation dans Xcode