2012-01-03 28 views
15

मान लें कि मेरे पास एक दृश्य नियंत्रक है, या एक विंडो नियंत्रक है, जो एक समान XIB फ़ाइल में "फ़ाइल के मालिक" (सामान्य रूप से) है।कार्यान्वयन (.m) फ़ाइलों में आईबीओलेटलेट आवृत्ति चर

यह (जैसा कि आप सभी जानते हैं) नियंत्रक वर्ग में IBOutlet एस के लिए बहुत आम है जिसे आप इंटरफ़ेस बिल्डर का उपयोग कर XIB में कनेक्ट कर सकते हैं।

अब तक, मैं अपने इंटरफ़ेस (.h) फ़ाइलों में IBOutlet इंस्टेंस चर बना रहा हूं। लेकिन (जैसा कि आप सभी जानते हैं) IBOutlet एस अक्सर नियंत्रक वर्ग का एक निजी तंत्र होते हैं; बाहरी लोगों को उनके बारे में भी नहीं पता होना चाहिए।

यही कारण है कि अब मैं उद्देश्य-सी ने हाल ही में ऐसा करने की क्षमता की पेशकश करना शुरू कर दिया है- मेरे सभी IBOutlet एस को मेरे कार्यान्वयन (.m) फ़ाइलों में रखना चाहता हूं।

मैंने ऐसा करने की कोशिश की, और ऐसा लगता है कि यह ठीक काम करता है। मेरे प्रश्न ये हैं: यह क्यों काम करता है? मैं इस धारणा के तहत था कि इंटरफेस बिल्डर केवल 'हेडर फाइलों को देख सकता था-उनकी कार्यान्वयन फाइलों में नज़र डालें। क्या मै गलत हु? इंटरफ़ेस बिल्डर कैसे कार्यान्वयन फ़ाइलों को "देख" सकता है? कार्यान्वयन फ़ाइलों में IBOutlet इंस्टेंस चर डालने के लिए संभावित रूप से खतरनाक हो सकता है?

+1

ध्यान दें कि मैक पर आधुनिक रनटाइम का उपयोग करते समय यह केवल तभी संभव है, जिसका मतलब केवल 64-बिट है। क्लासिक रनटाइम को हेडर में सभी ivars घोषित करने की आवश्यकता होती है। –

उत्तर

12

से Xcode 4 User Guide

नोट: क्योंकि Xcode 4 दोनों अपने हेडर फाइल और कार्यान्वयन अनुक्रमण के लिए फ़ाइलें, आप उन्हें रखते हैं करने के लिए की जरूरत के बिना कार्यान्वयन (मीटर) फाइलों में कार्यों और दुकानों को परिभाषित कर सकते पार्स शीर्षलेख फ़ाइल और आप सीधे निब फ़ाइल से कार्यान्वयन फ़ाइल में कनेक्शन बना सकते हैं। इसलिए, आपको के हिस्सों को अपने इंटरफ़ेस या कार्रवाइयों के उन हिस्सों को बेनकाब करने की आवश्यकता नहीं है जो आपके कक्षाओं का उपयोग कर रहे हों।

और के लिए कार्यान्वयन फ़ाइलों में आईबीओलेटलेट आवृत्ति चर डालने के लिए संभावित रूप से खतरनाक हो सकता है?

हां यह है, लेकिन जितना अधिक घोषित विधि को रनटाइम पर एक्सेस-स्कोप की कमी के कारण एक्सेस नहीं किया जा सकता है। यहां तक ​​कि यदि विधि सुलभ नहीं है, तो संकल्प रनटाइम पर किया जाता है और विधि से कोई एक्सेस-स्कोप जानकारी संलग्न नहीं होती है। इसे कार्यान्वित किया जा सकता था, लेकिन उद्देश्य-सी की कमी private, protected और सी ++ या जावा जैसी है। ध्यान दें कि ऐसे व्यवहार को लागू करना रनटाइम पर भी धीमा होगा।

+1

क्या आप समझा सकते हैं कि कार्यान्वयन फ़ाइलों में आईबीओलेटलेट इवर का उपयोग क्यों खतरनाक है? –

+0

क्योंकि इसका मतलब है कि आपका कुछ कोड जानबूझकर आपके निजी डेटा तक पहुंचता है जो डिजाइन खतरनाक है और ओओपी प्रतिमान – Geoffroy

+0

@ गीफ्रॉय के खिलाफ है, इसलिए आपको लगता है कि 'आईबीओलेटलेट' और 'आईबीएक्शन' कार्यान्वयन फ़ाइल में होना एक बुरा विचार है केवल? – Enchilada

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