2012-07-21 4 views
29

मुझे आश्चर्य है कि दो बार @interface क्यों है। class.h में और class.m में से एक।@ कार्यान्वयन के ऊपर @interface क्यों है?

TestTableViewController.h: उदाहरण के लिए:

#import <UIKit/UIKit.h> 

@interface TestTableViewController : UITableViewController 

@end 

और (स्वचालित रूप से उत्पन्न) class.m मैं लगता है:

#import "TestTableViewController.h" 

@interface TestTableViewController() 

@end 

@implementation TestTableViewController 

... methods delegated from UITable delegates 

@end 

तो मेरे सवाल है, क्या .m फ़ाइल में @interface TestTableViewController() बारे में है। यह क्यों है क्या मुझे इसकी ज़रूरत है?

अग्रिम

+0

संभावित डुप्लिकेट [.h और .m फ़ाइल में \ @interface परिभाषा के बीच अंतर] (http://stackoverflow.com/questions/3967187/difference-between-interface-definition-in-h-and-m- फ़ाइल), [आईओएस 5 परियोजनाओं में उपयोग की जाने वाली .m फ़ाइलों में \ @interface घोषणा क्या है?] (http://stackoverflow.com/questions/9751057/what-is-the-interface-declaration-in-m- फाइल-प्रयुक्त-इन-आईओएस -5-प्रोजेक्ट्स), [* .h और * .m फ़ाइलों में दो इंटरफेस] (http://stackoverflow.com/questions/9590917) [कार्यान्वयन फ़ाइल के अंदर इंटरफ़ेस घोषित करें (उद्देश्य- सी)] (http://stackoverflow.com/questions/10647913/) –

उत्तर

46

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

@interface MyClass() 

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

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

@interface MyClass (CategoryName) 

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

2

वहाँ में धन्यवाद आप निजी तरीकों और गुण है कि आप केवल अपनी कक्षा में उपयोग करना चाहते हैं घोषणा कर सकते हैं, लेकिन अन्य वर्गों को बेनकाब नहीं।

3

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

+0

नहीं, यह एक श्रेणी नहीं है, यह एक वर्ग विस्तार है। -1। –

+1

-1 के साथ बहुत अच्छा नहीं है .. श्रेणियों और एक्सटेंशन के बीच अंतर अधिकतर अर्थपूर्ण है: एक विस्तार मूल रूप से एक अज्ञात श्रेणी है, जिसे कक्षा के मुख्य कार्यान्वयन ब्लॉक में कार्यान्वित करने की आवश्यकता होती है। इस प्रकार, दूसरे "इंटरफ़ेस" ब्लॉक के कोष्ठक में एक नाम सेट करना प्रभावी रूप से एक श्रेणी बनायेगा और विस्तार नहीं होगा ... – dcoder

2

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

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

और इसी कार्यान्वयन: लेकिन इस मामले में यह लेखक हेडर फाइल

एक सामान्य श्रेणी इंटरफ़ेस इस तरह दिखता में बेनकाब करने के लिए नहीं चाहता है निजी तरीकों में से किसी प्रकार की घोषणा करने के लिए किया जाता है

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

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

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

+0

निजी विधियों और कोड वर्गीकृत करने के अलावा अन्य किसी भी चीज़ के लिए उपयोगी श्रेणियों का उपयोग कर रहा है? –

+0

मुझे बताने के लिए धन्यवाद। अब मुझे कक्षा विस्तार कहा नहीं गया था। मैंने अभी तक इसके बारे में एक श्रेणी के रूप में सोचा था। मैं इसे ठीक कर दूंगा। –

+0

भले ही कोई नाम न हो, फिर भी कक्षा को विस्तारित नहीं कर रहे हैं? फिर हम आवृत्ति चर कैसे जोड़ सकते हैं? – Honey