Özel yöntemlerinizi @implementation
blokta tanımlamak çoğu amaç için idealdir. Clang bunları @implementation
beyan düzeninden bağımsız olarak görecek . Bunları sınıf devamında (sınıf uzantısı olarak adlandırılır) veya adlandırılmış bir kategoride bildirmeye gerek yoktur.
Bazı durumlarda, yöntemi sınıf devamında bildirmeniz gerekir (örneğin, sınıf devamı ve arasında seçici kullanıyorsanız @implementation
).
static
fonksiyonlar özellikle hassas veya hız açısından kritik özel yöntemler için çok iyidir.
Ön ek adlandırma kuralı, özel yöntemlerin yanlışlıkla geçersiz kılınmasını önlemenize yardımcı olabilir (sınıf adını önek güvenli olarak bulurum).
Adlandırılmış kategoriler (örn. @interface MONObject (PrivateStuff)
) Yükleme sırasındaki adlandırma çakışmaları nedeniyle özellikle iyi bir fikir değildir. Gerçekten sadece arkadaş veya korunan yöntemler için yararlıdırlar (nadiren iyi bir seçimdir). Eksik kategori uygulamalarıyla ilgili uyarıldığınızdan emin olmak için gerçekte uygulamalısınız:
@implementation MONObject (PrivateStuff)
...HERE...
@end
İşte biraz açıklamalı hile sayfası:
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
Açık olmayan başka bir yaklaşım: C ++ türü hem çok hızlı olabilir hem de çok daha yüksek bir kontrol derecesi sağlarken, dışa aktarılan ve yüklenen objc yöntemlerinin sayısını en aza indirir.