การกำหนดวิธีการส่วนตัวใน@implementation
บล็อกนั้นเหมาะสำหรับวัตถุประสงค์ส่วนใหญ่ เสียงดังกราวจะเห็นสิ่งเหล่านี้ภายใน@implementation
, โดยไม่คำนึงถึงคำสั่งประกาศ ไม่จำเป็นต้องประกาศพวกเขาในการต่อเนื่องในชั้นเรียน (aka ส่วนขยายชั้นเรียน) หรือหมวดหมู่ที่มีชื่อ
ในบางกรณีคุณจะต้องประกาศวิธีในการเรียนต่อเนื่องของชั้นเรียน (เช่นหากใช้ตัวเลือกระหว่างการต่อชั้นเรียนกับ@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 ที่ลดจำนวนลง