.Hh और .m फ़ाइल में @interface परिभाषा के बीच अंतर


81

आम तौर पर हम उपयोग करते हैं

@interface interface_name : parent_class <delegates>
{
......
}
@end 

.h फ़ाइल और .m फ़ाइल में विधि। हम .h फ़ाइल में घोषित चर के गुणों को संश्लेषण करते हैं।

लेकिन कुछ कोड में, यह @interface ..... @ एंड विधि को .m फ़ाइल में भी रखा जाता है। इसका क्या मतलब है? उनके बीच क्या अंतर है?

इंटरफेस फ़ाइल के लिए गेटर्स और सेटर्स के बारे में भी कुछ शब्द दें जो कि .m फाइल में परिभाषित हो ...

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

जवाबों:


63

यह एक अतिरिक्त है @interfaceकि निजी तरीकों से एक श्रेणी को परिभाषित करता है डाल करने के लिए आम है :

व्यक्ति:

@interface Person
{
    NSString *_name;
}

@property(readwrite, copy) NSString *name;
-(NSString*)makeSmallTalkWith:(Person*)person;
@end

व्यक्ति:

@interface Person () //Not specifying a name for the category makes compiler checks that these methods are implemented.

-(void)startThinkOfWhatToHaveForDinner;
@end


@implementation Person

@synthesize name = _name;

-(NSString*)makeSmallTalkWith:(Person*)person
{
    [self startThinkOfWhatToHaveForDinner];
    return @"How's your day?";
}


-(void)startThinkOfWhatToHaveForDinner
{

}

@end

'निजी श्रेणी' (किसी अनाम श्रेणी के लिए उचित नाम 'निजी श्रेणी' नहीं है, यह 'श्रेणी विस्तार' है)। कंपाइलर को चेतावनी देने से रोकता है कि विधियाँ परिभाषित हैं। हालाँकि, क्योंकि @interface.m फ़ाइल एक ऐसी श्रेणी है जिसमें आप इसमें ivars परिभाषित नहीं कर सकते हैं।

अद्यतन 6 अगस्त '12: इस उत्तर के लिखे जाने के बाद से उद्देश्य-सी विकसित हुआ है:

  • ivars एक वर्ग विस्तार में घोषित किया जा सकता है (और हमेशा हो सकता है - उत्तर गलत था)
  • @synthesize आवश्यक नहीं
  • ivarsअब शीर्ष पर ब्रेसिज़ में घोषित किया जा सकता है @implementation:

अर्थात्,

@implementation { 
     id _ivarInImplmentation;
}
//methods
@end

4
जब आप निजी इंटरफ़ेस घोषित करते हैं, तो छोटी सी बात वास्तव में कोष्ठक में कुछ भी नहीं डालती है। अन्यथा, यह सिर्फ एक श्रेणी बनाता है, और आप ऐसा नहीं चाहते हैं। @interface Person ()पर्याप्त होगा।
इटाई फेरबर

धन्यवाद itaiferber, मैंने उस पर ध्यान नहीं दिया था। मैंने अपना उत्तर अपडेट कर दिया है।
बेनेडिक्ट कोहेन

4
यदि लोगों को श्रेणियों के बारे में अधिक जानने में रुचि है .. यह पृष्ठ मेरे लिए बहुत उपयोगी था।
टिम

1
यदि कोष्ठक में कुछ भी नहीं है, तो यह वास्तव में एक class extensionनहीं कहा जाता हैcategory
पॉल। 9

5
@ दिग्गज91 यह उत्तर काफी पुराना है और शुरू में लिखे जाने के बाद से कंपाइलर में बहुत सुधार हुआ है। कंपाइलर को अब विधि के लिए घोषणा की आवश्यकता नहीं है यदि विधि बॉडी 'दृश्यमान' है। इसका मतलब यह है कि वर्ग निरंतरता ( @interface className ()) आम तौर पर अब केवल निजी @propertyएस होगी।
बेनेडिक्ट कोहेन

10

अवधारणा यह है कि यदि आप .h को अपनी कक्षा के सार्वजनिक इंटरफेस तक सीमित कर देते हैं, और फिर इस वर्ग विस्तार में निजी कार्यान्वयन विवरण डालते हैं, तो आप अपनी परियोजना को अधिक स्वच्छ बना सकते हैं।

जब आप ABC.h फ़ाइल में चर विधियों या गुणों की घोषणा करते हैं, तो इसका मतलब है कि ये चर गुण और विधियाँ कक्षा के बाहर पहुँच सकती हैं

@interface Jain:NSObject
{
    NSString *_name;
}

@property(readwrite, copy) NSString *name;
-(NSString*)makeSmallTalkWith:(Person*)jain;
@end

@ इनटरफेस आपको निजी आइवर, प्रॉपर्टी और तरीके घोषित करने की अनुमति देता है। तो आपके द्वारा यहां घोषित कुछ भी इस वर्ग के बाहर से नहीं पहुँचा जा सकता है। सामान्य तौर पर, आप डिफ़ॉल्ट रूप से सभी ivars, संपत्तियों और विधियों को निजी घोषित करना चाहते हैं

केवल यह कहें कि जब आप ABC.m फाइल में परिवर्तनशील तरीकों या गुणों की घोषणा करते हैं, तो इसका मतलब है कि ये चर गुण और विधियाँ कक्षा के बाहर नहीं पहुँच सकते हैं

@interface Jain()
    {
        NSString *_name;
    }

    @property(readwrite, copy) NSString *name;
    -(NSString*)makeSmallTalkWith:(Person*)jain;
    @end

0

आप अन्य .m फ़ाइल में अन्य कक्षाएं भी बना सकते हैं, उदाहरण के लिए अन्य छोटी कक्षाएं जो कि .h फ़ाइल में घोषित वर्ग से प्राप्त होती हैं, लेकिन कुछ अलग व्यवहार होती हैं। आप इसे फ़ैक्टरी पैटर्न में उपयोग कर सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.