La définition de vos méthodes privées en @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 l' @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:
@implementation MONObject (PrivateStuff)
...HERE...
@end
Voici un petit annoté feuille de triche:
MONObject.h
@interface MONObject : NSObject
// public declaration required for clients' visibility/use.
@property (nonatomic, assign, readwrite) bool publicBool;
// public declaration required for clients' visibility/use.
- (void)publicMethod;
@end
MONObject.m
@interface MONObject ()
@property (nonatomic, assign, readwrite) bool privateBool;
// you can use a convention where the class name prefix is reserved
// for private methods this can reduce accidental overriding:
- (void)MONObject_privateMethod;
@end
// The potentially good thing about functions is that they are truly
// inaccessible; They may not be overridden, accidentally used,
// looked up via the objc runtime, and will often be eliminated from
// backtraces. Unlike methods, they can also be inlined. If unused
// (e.g. diagnostic omitted in release) or every use is inlined,
// they may be removed from the binary:
static void PrivateMethod(MONObject * pObject) {
pObject.privateBool = true;
}
@implementation MONObject
{
bool anIvar;
}
static void AnotherPrivateMethod(MONObject * pObject) {
if (0 == pObject) {
assert(0 && "invalid parameter");
return;
}
// if declared in the @implementation scope, you *could* access the
// private ivars directly (although you should rarely do this):
pObject->anIvar = true;
}
- (void)publicMethod
{
// declared below -- but clang can see its declaration in this
// translation:
[self privateMethod];
}
// no declaration required.
- (void)privateMethod
{
}
- (void)MONObject_privateMethod
{
}
@end
Une autre approche qui ne peut pas être évident: d'un C++, 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.