2011-11-12 13 views
40

मैंने संकलन करने का प्रयास किया है, लेकिन हर बार जब मैं करता हूं, तो एक विधि एक अजीब" अपेक्षित प्रकार "त्रुटि फेंकता है। मेरे पास हेडर में एक विधि है:किसी विधि की वापसी प्रकार को इंगित करने वाली त्रुटि "

-(ANObject *)generateSomethingForSomethingElse:(NSString *)somethingElse; 

इस विधि के लिए रिटर्न प्रकार पर त्रुटि बिंदु। मैंने को #import "ANObject.h" और ANObject का उपयोग कर हेडर में आयात किया है ठीक है ..

ऐसा क्यों हो रहा है?

+0

ठीक लगता है .. क्या आप अपने कोड का एक हिस्सा पोस्ट कर सकते हैं? – Devarshi

+0

भी ... कुछ अन्य ढांचे का एनोब्जेक्ट हिस्सा है? – Devarshi

+4

कृपया ANObject.h की सामग्री और हेडर जो आपको समस्या दे रहा है, दोनों को शामिल करने के लिए अपना प्रश्न संपादित करें। और कृपया अपना वास्तविक कोड दिखाएं, न कि कोड को शामिल करें जिसमें समस्या शामिल नहीं हो सकती है। –

उत्तर

89

इस आदेश के साथ क्या करना है कि स्रोत फ़ाइलों में संकलित है आप पहले से ही शायद मालूम है कि आप एक विधि कॉल नहीं कर सकते हैं इससे पहले कि यह परिभाषित किया गया है कर रहे हैं:।

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", तो आप ऑब्जेक्ट का उदाहरण बनाने में सक्षम होंगे।

+0

स्टीव, क्या आप कारण बता सकते हैं कि ऐसा क्यों होता है? चीयर्स – theiOSDude

+2

@ burrows111: प्रतिबिंब पर, यह एक बहुत आलसी जवाब है; जब मैंने इसे लिखा था तो मुझे जल्दबाजी में होना चाहिए था। अन्य उत्तरों बताते हैं कि इसे कैसे हल किया जाए, लेकिन मैं ऐसा नहीं देख सकता जो बताता है कि ऐसा क्यों होता है। मुझे आशा है कि संपादित उत्तर आपको मदद करेगा। –

+0

बहुत अधिक समझ में आता है! चीयर्स दोस्त! – theiOSDude

1

आमतौर पर जब मुझे इस तरह की त्रुटि दिखाई देती है तो ऐसा इसलिए होता है क्योंकि मेरे पास पिछली पंक्ति पर एक टाइपो है, जैसे अतिरिक्त या अनुपलब्ध कंस्ट्रैसिस या कुछ। (स्यूडोकोड नीचे देखें)

52

मुझे हेडर पर परिपत्र निर्भरता होने पर यह त्रुटि hapenning मिली। अगर ज फ़ाइल जहां इस प्रणाली की घोषणा ANObject.h

+2

हां, मुझे परिपत्र निर्भरता के कारण समान त्रुटि मिल रही थी। इंटरफ़ेस फ़ाइल में अग्रेषित कक्षा घोषणा और कार्यान्वयन में हेडर फ़ाइल आयात करके इसे से बचें। –

+0

यह मेरे लिए बेहतर काम करता है :), धन्यवाद! – mm24

22

में आयात किया जाता है की जाँच करें आप मूल रूप से @interface से पहले

@class ANObject; 

जोड़ने!

+0

मुझे नहीं पता कि यह कैसे मेरी समस्या हल हो गया। #import काम नहीं करता है और @ क्लास काम करता है .. – dreampowder

+0

अच्छा है कि यह आपके लिए काम करता है :) – JomanJi

1

मुझे यह संदेश मिला, जब परिवर्तनीय प्रकार गलत वर्तनी थी। नीचे

उदा।

-(void)takeSimulatorSafePhotoWithPopoverFrame:(GCRect)popoverFrame { 
बजाय

.....

-(void)takeSimulatorSafePhotoWithPopoverFrame:(CGRect)popoverFrame { 
+3

मदद करने में हमेशा खुश रहें मुझे यह समझने में काफी समय लगेगा कि अंतर सीजीईजीईटी और जीसीआरईटी है। – OlivaresF

4

तो, किसी कारण मापदंडों में एक enum प्रकार के साथ एक पद्धति सेट करने का प्रयास करते हुए मैं यह त्रुटि हो रही थी के लिए। इस तरह:

- (void)foo:(MyEnumVariable)enumVariable; 

मैंने पहले इसे इस तरह इस्तेमाल किया था और कभी भी कोई समस्या नहीं थी लेकिन अब मैंने किया था। मैंने परिपत्र निर्भरता की जांच की और कोई भी नहीं मिला। मैंने टाइपो को कई बार और कोई पासा भी नहीं देखा। इससे पहले कि मैं चर का उपयोग करना चाहता हूं, 'मुद्दा' को जोड़ना मेरे मुद्दे को हल करना था। इसलिए जैसा:

- (void)foo:(enum MyEnumVariable)enumVariable; 
{ 
    enum MyEnumVariable anotherEnumVariable; 
} 
1

यह बेवकूफ लग सकता है, लेकिन गलत बमबारी या अपर केस/लोअर केस letterwrong मामले इस बात का गलत इस्तेमाल करते हैं।

+0

मुझे उन पत्रों के मामलों से नफरत है! – DiscDev

0

आश्चर्यजनक रूप से पर्याप्त, मेरे आयात के आदेश को बदलने से पहले यह तय हो गया है ... आपके सभी अन्य आयातों के बाद आयात को नीचे ले जाने का प्रयास करें।

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