Menentukan metode pribadi Anda di @implementation
blok sangat ideal untuk sebagian besar tujuan. Dentang akan melihat ini di dalam @implementation
, terlepas dari perintah deklarasi. Tidak perlu mendeklarasikan mereka dalam kelanjutan kelas (alias ekstensi kelas) atau kategori bernama.
Dalam beberapa kasus, Anda perlu mendeklarasikan metode dalam kelanjutan kelas (misalnya jika menggunakan pemilih antara kelanjutan kelas dan @implementation
).
static
fungsi sangat baik untuk metode pribadi yang sangat sensitif atau kecepatan kritis.
Suatu konvensi untuk penamaan awalan dapat membantu Anda menghindari override metode pribadi (saya menemukan nama kelas sebagai awalan aman).
Kategori yang diberi nama (mis. @interface MONObject (PrivateStuff)
) Bukan ide yang sangat baik karena potensi tabrakan penamaan saat memuat. Mereka benar-benar hanya berguna untuk teman atau metode yang dilindungi (yang jarang merupakan pilihan yang baik). Untuk memastikan Anda diperingatkan tentang implementasi kategori yang tidak lengkap, Anda harus benar-benar mengimplementasikannya:
@implementation MONObject (PrivateStuff)
...HERE...
@end
Inilah sedikit cheat sheet beranotasi:
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
Pendekatan lain yang mungkin tidak jelas: tipe C ++ bisa sangat cepat dan memberikan tingkat kontrol yang jauh lebih tinggi, sambil meminimalkan jumlah metode objek yang diekspor dan dimuat.