इस आदेश के साथ क्या करना है कि स्रोत फ़ाइलों में संकलित है आप पहले से ही शायद मालूम है कि आप एक विधि कॉल नहीं कर सकते हैं इससे पहले कि यह परिभाषित किया गया है कर रहे हैं:।
var value = someMethod();
function someMethod()
{
...
}
यह एक संकलन-समय त्रुटि उत्पन्न करेगा क्योंकि कुछ विधि() अभी तक परिभाषित नहीं किया गया है। कक्षाओं के बारे में भी यही सच है। कक्षाओं को दूसरे के बाद संकलक द्वारा संकलित किया जाता है।
तो, अगर आप कल्पना करते हैं कि संकलन से पहले सभी वर्गों को एक विशाल फ़ाइल में रखा जा रहा है, तो आप पहले से ही इस मुद्दे को देख पाएंगे। ,
@interface BoatYard : NSObject
@property (nonatomic, retain) Ship* currentShip;
@end
@interface Ship : NSObject
@property (nonatomic, retain) NSString* name;
@property (nonatomic, assign) float weight;
@end
एक बार फिर क्योंकि Ship
वर्ग अभी तक निर्धारित नहीं किया गया है, हम अभी तक यह उल्लेख करने के लिए नहीं कर सकते हैं: चलो Ship
और BoatYard
वर्ग पर नजर डालते हैं। इस विशेष समस्या को हल करना बहुत आसान है; संकलन आदेश बदलें और संकलित करें। मुझे यकीन है कि आप XCode में इस स्क्रीन के साथ familliar कर रहे हैं रहा हूँ:
लेकिन आप जानते हैं कि आप फ़ाइलों को और सूची में नीचे खींच सकते हैं कर रहे हैं? यह ऑर्डर बदलता है कि फाइलों को संकलित किया जाएगा। इसलिए, BoatYard
कक्षा से ऊपर Ship
कक्षा को स्थानांतरित करें, और सभी अच्छे हैं।
लेकिन, यदि आप ऐसा नहीं करना चाहते हैं, या अधिक महत्वपूर्ण बात यह है कि क्या दो वस्तुओं के बीच एक परिपत्र संबंध है?
@interface BoatYard : NSObject
@property (nonatomic, retain) Ship* currentShip;
@end
@interface Ship : NSObject
@property (nonatomic, retain) BoatYard* currentBoatYard;
@property (nonatomic, retain) NSString* name;
@property (nonatomic, assign) float weight;
@end
ओह प्रिय, अब हम एक समस्या है: के मौजूदा BoatYard
कि Ship
में है के लिए एक संदर्भ जोड़कर उस वस्तु आरेख की जटिलता में वृद्धि करते हैं। इन दोनों को एक साथ संकलित नहीं किया जा सकता है। हमें संकलक को सूचित करने के लिए एक तरीका चाहिए कि जहाज * वर्ग वास्तव में मौजूद है। और यही कारण है कि @class
कीवर्ड इतना आसान है।
इसे आम आदमी के शब्दों में रखने के लिए, आप कह रहे हैं, "मेरा विश्वास करो, Ship
वास्तव में मौजूद है, और आप इसे वास्तव में जल्द ही देखेंगे"। यह सब एक साथ रखा करने के लिए:
@class Ship;
@interface BoatYard : NSObject
@property (nonatomic, retain) Ship* currentShip;
@end
@interface Ship : NSObject
@property (nonatomic, retain) BoatYard* currentBoatYard;
@property (nonatomic, retain) NSString* name;
@property (nonatomic, assign) float weight;
@end
अब संकलक जानता है के रूप में यह BoatYard
संकलित, कि एक Ship
वर्ग परिभाषा जल्द ही दिखाई देगा। बेशक, अगर ऐसा नहीं होता है, तो संकलन अभी भी सफल होगा।
सभी @class
कीवर्ड हालांकि संकलक को सूचित करता है कि कक्षा जल्द ही साथ आएगी। यह #import
के लिए एक प्रतिस्थापन है।तुम अब भी शीर्ष लेख फ़ाइल आयात करना होगा, या आप कक्षा internals के किसी भी के लिए पहुँच नहीं होगा:
@class Ship
-(void) example
{
Ship* newShip = [[Ship alloc] init];
}
यह काम नहीं कर सकता, और एक त्रुटि संदेश कह रही है कि जहाज एक आगे घोषणा है के साथ असफल हो जायेगी। एक बार जब आप #import "Ship.h"
, तो आप ऑब्जेक्ट का उदाहरण बनाने में सक्षम होंगे।
ठीक लगता है .. क्या आप अपने कोड का एक हिस्सा पोस्ट कर सकते हैं? – Devarshi
भी ... कुछ अन्य ढांचे का एनोब्जेक्ट हिस्सा है? – Devarshi
कृपया ANObject.h की सामग्री और हेडर जो आपको समस्या दे रहा है, दोनों को शामिल करने के लिए अपना प्रश्न संपादित करें। और कृपया अपना वास्तविक कोड दिखाएं, न कि कोड को शामिल करें जिसमें समस्या शामिल नहीं हो सकती है। –