Xác định các phương thức riêng tư của bạn trong @implementation
khối là lý tưởng cho hầu hết các mục đích. Clang sẽ thấy những điều này trong @implementation
, bất kể thứ tự khai báo. Không cần phải khai báo chúng trong phần tiếp theo lớp (hay còn gọi là mở rộng lớp) hoặc thể loại được đặt tên.
Trong một số trường hợp, bạn sẽ cần khai báo phương thức trong phần tiếp tục lớp (ví dụ: nếu sử dụng bộ chọn giữa phần tiếp tục lớp và phần @implementation
).
static
các chức năng rất tốt cho các phương pháp riêng tư đặc biệt nhạy cảm hoặc tốc độ.
Một quy ước để đặt tên tiền tố có thể giúp bạn tránh vô tình ghi đè các phương thức riêng tư (tôi thấy tên lớp là tiền tố an toàn).
Các danh mục được đặt tên (ví dụ @interface MONObject (PrivateStuff)
) không phải là một ý tưởng đặc biệt tốt vì các xung đột đặt tên tiềm năng khi tải. Chúng thực sự chỉ hữu ích cho bạn bè hoặc các phương pháp được bảo vệ (rất hiếm khi là một lựa chọn tốt). Để đảm bảo bạn được cảnh báo về việc triển khai danh mục không đầy đủ, bạn thực sự nên thực hiện nó:
@implementation MONObject (PrivateStuff)
...HERE...
@end
Dưới đây là một bảng cheat chú thích nhỏ:
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
Một cách tiếp cận khác có thể không rõ ràng: một loại C ++ có thể rất nhanh và cung cấp mức độ kiểm soát cao hơn nhiều, trong khi giảm thiểu số lượng phương thức objc được xuất và tải.