@implementation
ブロックでプライベートメソッドを定義することは、ほとんどの目的にとって理想的です。Clangは@implementation
、宣言の順序に関係なく、内でこれらを参照します。クラスの継続(別名クラス拡張)または名前付きカテゴリでそれらを宣言する必要はありません。
場合によっては、クラスの継続でメソッドを宣言する必要があります(たとえば、クラスの継続との間のセレクターを使用する場合@implementation
)。
static
関数は、特に機密性の高い、または速度が重要なプライベートメソッドに非常に適しています。
プレフィックスの命名規則は、プライベートメソッドを誤ってオーバーライドするのを防ぐのに役立ちます(クラス名はプレフィックスとして安全だと思います)。
名前付きカテゴリ(など@interface MONObject (PrivateStuff)
)は、ロード時に名前が競合する可能性があるため、特に良いアイデアではありません。これらは本当に、フレンドメソッドまたは保護されたメソッドにのみ役立ちます(これは非常にまれな選択肢です)。不完全なカテゴリの実装について警告されるようにするには、実際に実装する必要があります。
@implementation MONObject (PrivateStuff)
...HERE...
@end
これは少し注釈が付いたチートシートです:
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
明白ではないかもしれない別のアプローチ:C ++型は、非常に高速であり、はるかに高度な制御を提供すると同時に、エクスポートおよびロードされるobjcメソッドの数を最小限に抑えることができます。