2012-04-04 9 views
67

इन दो वर्ग घोषणाओं के बीच क्या अंतर है? मुझे समझ में नहीं आता क्यों @class का उपयोग किया जाता है। धन्यवाद।उद्देश्य-सी: @class निर्देश @interface से पहले?

@class TestClass; 

@interface TestClass: UIView { 
    UIImage *image1; 
    UIImage *image2; 
} 

और

@interface TestClass: UIView { 
    UIImage *image1; 
    UIImage *image2; 
} 

उत्तर

165

@class परिपत्र निर्भरता को तोड़ने के लिए मौजूद है। मान लें कि आपके पास कक्षा ए और बी

@interface A:NSObject 
- (B*)calculateMyBNess; 
@end 

@interface B:NSObject 
- (A*)calculateMyANess; 
@end 

चिकन; अंडे से मिलें यह कभी संकलित नहीं हो सकता क्योंकि ए का इंटरफ़ेस बी पर परिभाषित किया गया है और इसके विपरीत।

इस प्रकार, यह @class का उपयोग करके ठीक किया जा सकता:

@class B; 
@interface A:NSObject 
- (B*)calculateMyBNess; 
@end 

@interface B:NSObject 
- (A*)calculateMyANess; 
@end 

@class प्रभावी रूप से संकलक कि इस तरह के एक वर्ग कहीं, और इस प्रकार संकेत कहा वर्ग के उदाहरण को इंगित करने की घोषणा की पूरी तरह से वैध हैं मौजूद है बताता है। हालांकि, अगर आप एक उदाहरण संदर्भ जिसका प्रकार केवल एक @class के रूप में परिभाषित किया गया है पर एक विधि कॉल नहीं कर सका क्योंकि संकलक के लिए कोई अतिरिक्त मेटाडाटा उपलब्ध है वहाँ (मुझे याद नहीं करता है, तो इसके माध्यम से एक फोन के रूप में मूल्यांकन किया जा रहा करने के लिए कॉल साइट reverts id या नहीं)।

अपने उदाहरण में, @class हानिरहित, लेकिन पूरी तरह अनावश्यक है।

+17

मेरी इच्छा है कि मैं सिर्फ 'चिकन, अंडे से मिलें' – lukya

+4

बीटीडब्लू के लिए एक और +1 दे सकता हूं, यह 'आईडी' मूल्यांकन पर वापस आ जाता है। – jheld

+0

क्या कोई विशेष कारण हैं कि कुछ व्यक्ति अपनी .h फ़ाइल में '@ class' डालते हैं और फिर आवश्यक। हेड फ़ाइल को उनकी .m फ़ाइल में आयात करते हैं, और अन्य वर्तमान कक्षा शीर्षलेख फ़ाइल में .h फ़ाइल आयात कर सकते हैं? बस उत्सुक, धन्यवाद। @bbum –

15
@class TestClass; 

यह केवल वाणी "वर्ग TestClass परिभाषित किया जाएगा"।

इस मामले (एक आप चिपकाया) इस जो भी की कोई प्रभाव नहीं है में, तो ये एक ही कर रहे हैं।

हालांकि, मामले में आप एक प्रोटोकॉल है जो (सौंपने के लिए पारित कर दिया मापदंडों के प्रकार के रूप में, उदाहरण के लिए) अपने वर्ग के नाम का प्रयोग करेंगे को परिभाषित करने के लिए जा रहे हैं, तो आप प्रोटोकॉल परिभाषा से पहले @class TestClass घोषित करने के लिए, के रूप में अपने वर्ग है की आवश्यकता होगी अभी भी परिभाषित नहीं है।

सामान्य में, अगर आप पहले वर्ग परिभाषा किया जाता है अपने वर्ग के नाम का उल्लेख करने की जरूरत है, तो आप @class घोषणा पहले

+0

देखा ive के साथ प्रोटोकॉल लागू प्रोटोकॉल से पहले यह कार्यान्वयन सबसे अधिक है। साझा करने के लिए धन्यवाद! – SleepsOnNewspapers

6

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

मैं अंधेरे में एक स्टैब लेने जा रहा हूं और कहता हूं कि @interface में आवृत्ति चर घोषित किए गए हैं, तो आप कुछ पुराने कोड को देख रहे हैं। क्योंकि यह पुराने कोड है, @class शायद कहीं और हुआ करता था (जैसे, वहाँ एक प्रतिनिधि प्रोटोकॉल के बीच में घोषित किया गया था) और सिर्फ कोई हानि पहुंचाए बिना समाप्त हो गया है फंसे।

1

@class बहुत आसान है जब आप एक उद्देश्य यह है कि आम तौर पर वस्तु जिसका इंटरफेस आप भी परिभाषित कर रहे हैं के साथ बातचीत करेंगे के लिए एक प्रोटोकॉल परिभाषित करने की जरूरत है। @class का उपयोग करके, आप अपनी कक्षा के शीर्षलेख में प्रोटोकॉल परिभाषा को रख सकते हैं। प्रतिनिधिमंडल का यह पैटर्न अक्सर उद्देश्य-सी पर प्रयोग किया जाता है, और अक्सर "MyClass.h" और "MyClassDelegate.h" दोनों को परिभाषित करने के लिए बेहतर होता है।यही कारण है कि कुछ भ्रामक आयात समस्याओं के कारण

@class MyClass; 

@protocol MyClassDelegate<NSObject> 

- (void)myClassDidSomething:(MyClass *)myClass 
- (void)myClass:(MyClass *)myClass didSomethingWithResponse:(NSObject *)reponse 
- (BOOL)shouldMyClassDoSomething:(MyClass *)myClass; 
- (BOOL)shouldMyClass:(MyClass *)myClass doSomethingWithInput:(NSObject *)input 

@end 

@interface MyClass : NSObject 

@property (nonatomic, assign) id<MyClassDelegate> delegate; 

- (void)doSomething; 
- (void)doSomethingWithInput:(NSObject *)input 

@end 

फिर, जब आप वर्ग का उपयोग कर रहे हैं, तो आप दोनों वर्ग के उदाहरण बना सकते हैं कर सकते हैं और साथ ही एक भी इंपोर्ट स्टेटमेंट

#import "MyClass.h" 

@interface MyOtherClass()<MyClassDelegate> 

@property (nonatomic, strong) MyClass *myClass; 

@end 

@implementation MyOtherClass 

#pragma mark - MyClassDelegate Protocol Methods 

- (void)myClassDidSomething:(MyClass *)myClass { 

    NSLog(@"My Class Did Something!") 

} 

- (void)myClassDidSomethingWithResponse:(NSObject *)response { 

    NSLog(@"My Class Did Something With %@", response); 

} 

- (BOOL)shouldMyClassDoSomething { 

    return YES; 

- (BOOL)shouldMyClassDoSomethingWithInput:(NSObject *)input { 

    if ([input isEqual:@YES]) { 

     return YES; 

    } 

    return NO; 

} 


- (void)doSomething { 

    self.myClass = [[MyClass alloc] init]; 
    self.myClass.delegate = self; 
    [self.myClass doSomething]; 
    [self.myClass doSomethingWithInput:@0]; 

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