objective c - @ सर्टिफिकेशन के ऊपर @interface क्यों है?




objective-c ios (3)

मैं सोच रहा हूं कि दो बार @interface क्यों है। एक class.m । दूसरी और दूसरी class.m । उदाहरण के लिए:

TestTableViewController.h :

#import <UIKit/UIKit.h>

@interface TestTableViewController : UITableViewController

@end

और (स्वचालित रूप से उत्पन्न) class.m I class.m :

#import "TestTableViewController.h"

@interface TestTableViewController ()

@end

@implementation TestTableViewController

... methods delegated from UITable delegates

@end

तो मेरा सवाल यह है कि .m file में @interface TestTableViewController () क्या है। यह वहाँ क्यों है? क्या मुझे इसकी आवश्यकता है?

अग्रिम में धन्यवाद


दूसरा "इंटरफ़ेस" "TestTableViewController" वर्ग के लिए एक एक्सटेंशन को परिभाषित करता है, जो किसी ऐसे व्यक्ति को दिखाई नहीं देता है जो केवल h फ़ाइल आयात करता है। यह उद्देश्य सी में निजी तरीके बनाने के लिए वास्तविक तरीका है।


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

@interface MyClass ()

यह विशेष रूप से महत्वपूर्ण है क्योंकि आप इसका उपयोग अपनी कक्षा में अतिरिक्त उदाहरण चर जोड़ने के लिए कर सकते हैं।

दूसरा, जिसे "श्रेणी" कहा जाता है, को कोष्ठक के एक गैर-खाली जोड़े द्वारा इंगित किया जाता है, जो इस तरह से श्रेणी का नाम संलग्न करता है:

@interface MyClass (CategoryName)

और इसका उपयोग कक्षा को विस्तारित करने के लिए भी किया जाता है। आप श्रेणियों का उपयोग करके एक वर्ग में उदाहरण चर नहीं जोड़ सकते हैं, लेकिन आपके पास एक ही वर्ग के लिए कई श्रेणियां हो सकती हैं, यही कारण है कि इसका उपयोग मुख्य रूप से सिस्टम / फ्रेमवर्क कक्षाओं को विस्तारित करने के लिए किया जाता है जिसके लिए आपके पास स्रोत कोड नहीं है - इसलिए एक वर्ग, इस अर्थ में, वर्ग विस्तार के बिल्कुल विपरीत है।


TestTableViewController.h फ़ाइल में इंटरफ़ेस एक क्लास एक्सटेंशन की घोषणा है। 2 गोल कोष्ठक हैं जो इसे दिखाते हैं। वाक्य रचना एक वर्ग के लिए एक श्रेणी लिखने के समान है। लेकिन इस मामले में इसका उपयोग कुछ प्रकार के निजी तरीकों को घोषित करने के लिए किया जाता है जो लेखक हेडर फ़ाइल में उजागर नहीं करना चाहता है

एक सामान्य श्रेणी इंटरफ़ेस इस तरह दिखता है:

@interface TestTableViewController (Your_Category_Name)
- (void)doSomething;
@end

और इसी कार्यान्वयन:

@implementation TestTableViewController (Your_Category_Name)
-(void)doSomething {
// Does something...
}
@end

आपके उदाहरण में कोई श्रेणी का नाम निर्दिष्ट नहीं किया गया है, इसलिए यह सिर्फ कक्षा का विस्तार करता है और आप सामान्य कार्यान्वयन में विधि को लागू कर सकते हैं।

आम तौर पर इस तकनीक का उपयोग "छिपाने" के तरीकों के लिए किया जाता है। वे हेडर फ़ाइल में घोषित नहीं किए जाते हैं और यदि आप केवल .h फ़ाइल आयात करते हैं तो वे दिखाई नहीं देते हैं।





xcode4.4