2009-07-13 11 views
5

मैं एक आईफोन ऐप विकसित कर रहा हूं, और मैं उद्देश्य-सी और class.h और class.m संरचना के लिए भी नया हूं।उद्देश्य-सी में दो वर्गों के बीच संदर्भ कैसे हो सकता है?

अब, मेरे पास दो कक्षाएं हैं जिन्हें दोनों को किसी अन्य प्रकार का चर होना चाहिए। लेकिन यह असंभव लगता है।

यदि कक्षा 1.m (या class2.m) में कक्षा 1.h, और फिर class2.h शामिल है, तो मैं कक्षा 1.h में class2 चर घोषित नहीं कर सकता, अगर मैं class2.h और फिर class1.h शामिल करता हूं , मैं class2.h में class1 चर घोषित नहीं कर सकता।

आशा है कि आपको मेरा विचार मिल जाएगा, क्योंकि यह मुझे पागल कर रहा है। क्या यह वास्तव में पूरा करना असंभव है?

धन्यवाद।

+4

यह हो सकता है कि आप जो खोज रहे हैं: http://stackoverflow.com/questions/322597/objective-c-class-vs-import – teabot

उत्तर

20

आप हेडर फ़ाइल में किसी वर्ग को अग्रेषित करने के लिए @class कीवर्ड का उपयोग कर सकते हैं। यह आपको हेडर फ़ाइल #import के बिना इंस्टेंस चर को परिभाषित करने के लिए कक्षा का नाम उपयोग करने देता है।

Class1.h

@class Class2; 

@interface Class1 
{ 
    Class2 * class2_instance; 
} 
... 
@end 

Class2.h

@class Class1; 

@interface Class2 
{ 
    Class1 * class1_instance; 
} 
... 
@end 

नोट आप अभी भी #import करने के लिए अपने मीटर फाइलों में उचित हेडर फाइल करना होगा कि

+1

+1 वास्तव में, कुछ लोग दृढ़ता से केवल आपके भीतर इस तरह से अनुशंसा करते हैं अपना कोड चूंकि आपको आमतौर पर केवल हेडर में वर्ग प्रकार का नाम (चर, पैरामीटर और रिटर्न प्रकारों के लिए) की आवश्यकता होती है, यह आपकी आयात श्रृंखला को सरल बनाने के लिए प्रेरित करता है, और सभी शीर्षलेख फ़ाइलों को संसाधित करने के लिए तेज़ी से बनाता है। निश्चित रूप से प्रश्न के ठीक नीचे प्रदान किए गए SO लिंक @teabot को भी देखें। –

+0

@ क्विन टेलर: अच्छा बिंदु। मैंने कभी भी अपने हेडर फाइलों में '# import' का उपयोग नहीं किया है, जब तक कि यह विरासत के लिए आवश्यक न हो। –

+0

धन्यवाद। लेकिन ऐसा लगता है कि यह हर तरह से काम नहीं करता है। जब मैं इसका उपयोग करता हूं तो मुझे यह संदेश मिलता है। "चेतावनी: रिसीवर" कक्षा 2 "एक आगे की कक्षा है और संबंधित @interface मौजूद नहीं हो सकता है"। और जब मैं इसके किसी घटकों तक पहुंचने का प्रयास करता हूं, तो यह पता चलता है कि वह घटक मौजूद नहीं है। उचित शीर्षलेख से आपका मतलब है कि यह अपना हेडर है? या दोनों ही? – treznik

3

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

क्या आप उस कार्यक्षमता का वर्णन कर सकते हैं जिसे प्रत्येक वर्ग को दूसरे से चाहिए?

+0

ठीक है। असल में कक्षा 1 कक्षा 2 का एक उदाहरण बनाता है, जो एक ऐसी स्क्रिप्ट को निकालता है जो बाह्य छवि को असीमित रूप से लोड करता है, और जब छवियों को लोड किया जाता है तो कक्षा 2 से एक विधि निकाल दी जाती है, जिसे कक्षा 1 से विधि को आग लगाना चाहिए। आप सोच सकते हैं कि मुझे कक्षा 2 के बाद मुझे क्यों आवश्यकता है, जहां छवि लोड के अलावा कुछ अतिरिक्त कार्यक्षमताएं हैं इसलिए मुझे इसकी आवश्यकता है। हम्म, मुझे अभी एहसास हुआ, क्या मैं कक्षा 1 संदर्भों को प्रकार के रूप में संग्रहीत कर सकता हूं? – treznik

+0

एक प्रतिनिधि या घटना के लिए नौकरी की तरह लगता है। कक्षा 2 को यह जानने की आवश्यकता नहीं है कि विशेष रूप से कक्षा 1 छवि लोड पूर्ण होने की परवाह करता है, बस वहां अन्य लोग हैं जो इसके बारे में जानना चाहते हैं।कक्षा 2 को एक ईवेंट/अधिसूचना का पर्दाफाश करना चाहिए जो छवि लोड पूर्ण होने पर आग लगती है। उपभोक्ता सदस्यता लेने के लिए जिम्मेदार होते हैं और यह चुनते हैं कि अधिसूचना कब होती है। –

+2

ऑब्जेक्ट्स के बीच ढीले-युग्मित संचार को लागू करने के कई तरीके यहां दिए गए हैं: http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/CommunicateWithObjects.html –