@implementation
ब्लॉक में अपने निजी तरीकों को परिभाषित करना अधिकांश उद्देश्यों के लिए आदर्श है। @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
एक और दृष्टिकोण जो स्पष्ट नहीं हो सकता है: एक सी ++ प्रकार दोनों बहुत तेज हो सकता है और निर्यात और लोड किए गए objc तरीकों की संख्या को कम करते हुए बहुत अधिक नियंत्रण प्रदान कर सकता है।