Definir seus métodos particulares no @implementation
bloco é ideal para a maioria dos propósitos. Clang verá isso dentro da ordem @implementation
, independentemente da declaração. Não há necessidade de declará-los em uma continuação de classe (também conhecida como extensão de classe) ou categoria nomeada.
Em alguns casos, você precisará declarar o método na continuação da classe (por exemplo, se estiver usando o seletor entre a continuação da classe e a @implementation
).
static
funções são muito boas para métodos particulares particularmente sensíveis ou críticos para a velocidade.
Uma convenção para nomear prefixos pode ajudar a evitar a substituição acidental de métodos privados (acho o nome da classe um prefixo seguro).
As categorias nomeadas (por exemplo @interface MONObject (PrivateStuff)
) não são uma ideia particularmente boa devido a possíveis colisões de nomes durante o carregamento. Eles são realmente úteis apenas para métodos protegidos ou amigos (que raramente são uma boa escolha). Para garantir que você seja avisado sobre implementações de categorias incompletas, você deve realmente implementá-lo:
@implementation MONObject (PrivateStuff)
...HERE...
@end
Aqui está uma pequena folha de dicas anotadas:
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
Outra abordagem que pode não ser óbvia: um tipo C ++ pode ser muito rápido e fornecer um grau de controle muito mais alto, minimizando o número de métodos objc exportados e carregados.