2010-03-30 13 views
5

मैं इकट्ठा करता हूं कि उद्देश्य-सी में मुझे अपनी कक्षा के इंटरफ़ेस के हिस्से के रूप में आवृत्ति चर घोषित करना होगा, भले ही ये चर कार्यान्वयन विवरण हों और निजी पहुंच हो।उद्देश्य-सी: अमूर्त लीक को कैसे रोकें

"व्यक्तिपरक" सी में, मैं अपनी .c फ़ाइल में एक चर घोषित कर सकता हूं और यह उस संकलन इकाई के बाहर दिखाई नहीं दे रहा है। मैं इसे इसी .h फ़ाइल में घोषित कर सकता हूं, और उसके बाद उस संकलन इकाई में जो कोई भी लिंक वैरिएबल देख सकता है।

मुझे आश्चर्य है कि उद्देश्य-सी में समकक्ष विकल्प है, या यदि मुझे वास्तव में मेरी कक्षा के लिए .h में प्रत्येक ivar घोषित करना होगा।

एरि।

+3

+1, और विषय-सी नोट के लिए। –

उत्तर

2

अरी,

कैसे "अदृश्य" उदाहरण चर घोषणाओं को पूरा करने के लिए एक अच्छा संदर्भ be found here क्रेडिट के साथ सम्मान से मैट Gallagher के लिए दिया जा सकता है।

आशा है कि यह मदद करता है, फ्रैंक

+0

सही। वास्तव में मेरे प्रश्न का उत्तर देने वाला बिट यह है कि मैं अपनी .m फ़ाइल में @interface का हिस्सा डाल सकता हूं। सूचक के लिए धन्यवाद। – iter

0

उपयोग को सीमित करने के लिए, आप @private या @protected खोजशब्दों का उपयोग कर सकते हैं:

@interface Foo : NSObject { 
    @private 
    int barPrivate; 

    @protected 
    int barProtected; 

    @public 
    int barPublic; 
} 
@end 

संपादित करें:स्क्रैच सब कुछ, मैं वास्तव में कुछ नींद की जरूरत पता चला है।

+0

यह सही है, आप एक श्रेणी के साथ उदाहरण चर जोड़ नहीं सकते हैं। – codewarrior

+0

हाँ, मुझे याद आया कि मैंने जवाब पोस्ट करने के ठीक बाद। –

+0

'बार' के लिए अलग-अलग मानों के साथ एक से अधिक उदाहरण बनाएं और आप देखेंगे - 'बार' एक वैश्विक चर है। – Chuck

2

उदाहरण चर पारंपरिक रूप से वर्ग का आकार निर्धारित करने के लिए आवश्यक किया गया है। सीधे इवर तक पहुंचने के लिए यह हमेशा खराब अभ्यास रहा है, और यह बात नहीं है। आधुनिक रनटाइम में, यह कम आवश्यक है, लेकिन किसी भी दर पर, यह एक अमूर्त रिसाव नहीं है जब तक कि क्लास कक्षाओं पर निर्भर न हो, जो असंभव होना चाहिए क्योंकि आप उन्हें @protected या @private के रूप में घोषित कर रहे हैं, है ना?

+0

स्पष्ट रूप से ivars की गणना करने के मूल सकारात्मक इरादे को इंगित करने के लिए धन्यवाद। मैं इतनी देर तक वास्तव में गतिशील भाषाओं (पायथन, लिस्प) का उपयोग कर रहा हूं, मैं भूल जाता हूं कि कुछ भाषाएं संकलन समय पर आकार जानना चाहती हैं। उद्देश्य-सी सीखने के कई तरीकों से मेमोरी लेन के नीचे एक यात्रा की तरह है। या एक खान शाफ्ट के नीचे: मुझे अपने जीवनकाल में भाषा में जमा तलछट के सभी अलग-अलग स्तरों को देखने को मिलता है। – iter

+0

@iter: अब उद्देश्य-सी में वास्तव में आवश्यकता भी नहीं है। आधुनिक रनटाइम पाइथन की तरह बहुत काम करता है, जहां आवृत्ति चर को शीर्षलेख में घोषित किए बिना सभी willy-nilly असाइन किया जा सकता है, लेकिन भाषा अभी भी अपने अतीत के वाक्यविन्यास के आसपास है। – Chuck

+0

मुझे लगता है कि मैं इसे दूसरे दिन चला सकता हूं, हालांकि, जब मैं intermittent objc_msgSend_fixup त्रुटियों में भागना शुरू कर दिया। मैं 100% निश्चित नहीं हूं, लेकिन जब मैं object_setClass को हटा देता हूं तो समस्या गायब हो जाती है, मैं किसी ऑब्जेक्ट को अतिरिक्त गुणों के साथ एक कस्टम क्लास में डालने के लिए उपयोग करता था। –

0

ivars @protected डिफ़ॉल्ट रूप से कर रहे हैं (हालांकि @private और @protected गारंटी नहीं है कि अन्य वर्गों उन तक पहुँच नहीं कर सकते हैं - आप हमेशा ivars getValue:forKey: साथ उपयोग कर सकते हैं)। आपको किसी भी मामले में सीधे अन्य कक्षाओं से सीधे इवर तक नहीं पहुंचना चाहिए - "पसंद" यह है कि इवर को गुणों के रूप में उजागर करना है या नहीं (आपको केवल इवर्स तक पहुंचने के लिए सम्मेलन के बाद सभी वर्गों पर भरोसा करना है)।

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

+0

मुझे क्लाइंट कोड को मेरे कोड के साथ कुछ अजीब करने से रोकने और क्लाइंट प्रोग्रामर को मेरे कार्यान्वयन के बारे में अधिक जानकारी देने के बारे में और जानने के बारे में चिंता करने की चिंता है। जब मैं एक .h फ़ाइल पढ़ता हूं, तो मैं जिस लाइब्रेरी का उपयोग कर रहा हूं उसका "बाहरी" आकार सीखना चाहता हूं। अगर मैं अपने आंतरिक कार्यों को जानना चाहता हूं, तो मैं .c या .m को केस के रूप में पढ़ सकता हूं। मैं इन दो अलग और अलग रखना पसंद करता हूं। – iter

+1

मैं सहमत हूं - यह परेशान है कि ivars .h फ़ाइल में हैं, लेकिन जैसा ऊपर बताया गया है, मुझे लगता है कि यह कंपाइलर के लाभ के लिए है। – shosti

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