2009-06-27 11 views

उत्तर

39

दो वाक्यविन्यास विभिन्न उद्देश्यों को पूरा करते हैं।

एक नामित श्रेणी - @interface फू (FooCategory) - आम तौर पर करने के लिए प्रयोग किया जाता है:

(1) कार्यक्षमता को जोड़कर एक मौजूदा वर्ग का विस्तार। उदाहरण: फाउंडेशन में एनएसएट्रिब्यूटेड स्ट्रिंग को ऐपकिट में एक श्रेणी द्वारा बढ़ाया गया है जो ऐपकिट विशिष्ट आरटीएफ-जैसे टेक्स्ट फॉर्मेटिंग एपीआई जोड़ता है।

(2) उन तरीकों का एक सेट घोषित करें जो एक प्रतिनिधि द्वारा लागू किया जा सकता है या नहीं। उदाहरण: विभिन्न वर्ग घोषित करते हैं - लेकिन कार्यान्वित नहीं करते - @interface NSObject (SetODelegateMethods)।

फॉर्म (2) अब पक्ष से बाहर हो गया है कि @protocol उद्देश्य-सी 2.0 में @ विकल्प विधियों का समर्थन करने के लिए बढ़ा दिया गया है।

एक वर्ग विस्तार - @interface फू() - एसपीआई या सिस्टम प्रोग्रामिंग इंटरफ़ेस - - आप अतिरिक्त निजी एपीआई घोषित करने के लिए अनुमति देने के लिए डिज़ाइन किया गया है कि वर्ग धर्मशाला लागू करने के लिए प्रयोग किया जाता है। यह आमतौर पर .m फ़ाइल के शीर्ष पर दिखाई देता है। कक्षा विस्तार में घोषित किए गए किसी भी तरीके/गुणों को @ @ कार्यान्वयन में लागू किया जाना चाहिए, जैसे सार्वजनिक @interface में पाए गए तरीकों/गुणों की तरह।

कक्षा एक्सटेंशन भी @ accessors synthesize'ing को ReadWrite पहले सार्वजनिक रूप से केवल पढ़ने के लिए @property redeclare के लिए इस्तेमाल किया जा सकता है।

उदाहरण:

Foo.h

@interface Foo:NSObject 
@property(readonly, copy) NSString *bar; 
-(void) publicSaucing; 
@end 

Foo.m

@interface Foo() 
@property(readwrite, copy) NSString *bar; 
- (void) superSecretInternalSaucing; 
@end 

@implementation Foo 
@synthesize bar; 
.... must implement the two methods or compiler will warn .... 
@end 
+0

@ सिंथेसिस बार नहीं है; लाइन का मतलब है कि कंपाइलर बार के लिए दो विधियों (गेटर और सेटर) उत्पन्न करेगा? – Elliot

+2

हां, लेकिन केवल सार्वजनिक हेडर में गेटर घोषित किया गया है, सेटर को कक्षा के अंदर उपयोग के लिए निजी रूप से घोषित किया जाता है। यह सी ++ नहीं है, यदि आप रनटाइम का आत्मनिरीक्षण करना चाहते हैं तो आप पता लगा सकते हैं कि सेटटर वहां है और जहां भी आप चाहते हैं उसे कॉल करें, लेकिन जब तक आप स्पष्ट रूप से ऐसा नहीं करते हैं तो आप संकलन चेतावनी प्राप्त करेंगे यदि आप आकस्मिक रूप से संपत्ति सेट करने का प्रयास करते हैं। –

+0

@ लुइस सही है। दूसरी संपत्ति "readwrite" निर्दिष्ट करके .h फ़ाइल प्रॉपर्टी में "readonly" ओवरराइड करता है, इसलिए संकलक वास्तव में करता है। हालांकि, केवल हेडर फ़ाइल सहित लोगों के लिए गेटटर दिखाई देता है, क्योंकि जब वे फ़ाइल आयात करते हैं तो वे केवल संपत्ति के "पठनीय" संस्करण को देखेंगे। –

2

हाँ,

निम्नलिखित अंतर देखते हैं।

1) अज्ञात श्रेणियों का उपयोग करने से संबंधित वर्ग के लिए मुख्य @ कार्यान्वयन ब्लॉक में अपनी विधियों को लागू करने की आवश्यकता होती है; अज्ञात श्रेणियां आपको प्राथमिक श्रेणी @interface ब्लॉक

2) MyClass (निजी) का उपयोग करते समय, निम्नलिखित में ध्यान में रखा जाना चाहिए: जोड़े गए नाम/श्रेणी को जोड़े जाना चाहिए विलक्षण हो। यदि आप अपनी कक्षा में एक निजी श्रेणी घोषित करते हैं, तो कोई समस्या नहीं है। हालांकि, मौजूदा वर्गों पर चीजें अलग-अलग हैं। उदाहरण के लिए, किसी दिए गए उद्देश्य-सी नेमस्पेस में केवल एक एनएसएसटींग (निजी) श्रेणी मौजूद हो सकती है। इससे समस्याएं पैदा हो सकती हैं क्योंकि उद्देश्य-सी नेमस्पेस प्रोग्राम कोड और सभी पुस्तकालयों, ढांचे और प्लग-इन के बीच साझा किया जाता है। यह विशेष रूप से उद्देश्य-सी प्रोग्रामर स्क्रीनसेवर, वरीयता पैन और अन्य प्लग-इन लिखने के लिए महत्वपूर्ण है क्योंकि उनके कोड को एप्लिकेशन या फ्रेमवर्क कोड में इंजेक्शन दिया जाएगा जिसे वे नियंत्रित नहीं करते हैं।

+0

आप यकीन है कि यह मामला है कि श्रेणियों विशिष्ट नामित किया जाना है है कर रहे हैं? यह मेरी समझ है कि जब तक चयनकर्ता अद्वितीय होते हैं, तब तक कोई संघर्ष नहीं होगा। रनटाइम श्रेणियों के बारे में भी जानते हैं? (क्रम संदर्भ उन्हें उल्लेख नहीं है) – rpetrich

+0

यह श्रेणी है जो विशिष्ट नामित किया जाना चाहिए नहीं है: यह जोड़ी वस्तु/श्रेणी है कि होना चाहिए है।अपनी परियोजना में से किसी एक में विभिन्न विधियों का उपयोग करके, यहां तक ​​कि दो अलग-अलग एनएसएसटींग (निजी) श्रेणियों को संकलित करने के लिए स्वयं को आज़माएं और देखें कि यह काम करता है या नहीं। –

+0

हम्म ... ऐसा लगता है कि संकलक/लिंकर कक्षा पर डुप्लिकेट श्रेणियों की अनुमति नहीं देता है, लेकिन रनटाइम करता है। आप एक + लोड विधि के साथ NSDictionary (NSDictionary) या NSError (NSErrorPrivate) श्रेणियों को परिभाषित कर सकते हैं और कंपाइलर, लिंकर और रनटाइम सभी अपेक्षित व्यवहार करेंगे (भले ही फाउंडेशन.फ्रेमवर्क आंतरिक रूप से उन दोनों श्रेणियों को लागू करता हो)। यदि आप एक श्रेणी को लागू करते हैं जिसे एनएसएसटींग (एनएसएसटींग एक्स्टेंशन मैथ्यूज) जैसे शीर्षलेख में नामित किया गया है, तो संकलक चेतावनियों को छोड़ देगा, लेकिन लिंकर और रनटाइम अभी भी अपेक्षित व्यवहार करेगा। असली दुनिया में वास्तव में कोई भी वास्तव में उपयोगी नहीं है। – rpetrich

संबंधित मुद्दे