2012-07-27 6 views
6

मैं जब मैं (कोई दूसरे माता पिता कक्षाएं इस व्यवहार कि मैंने देखा है उत्पन्न) एक UIViewContoller का एक नया उपवर्ग बनाने iOS6 बीटा 3एक्सकोड अब एक खाली श्रेणी उत्पन्न करता है। क्यूं कर?

का उपयोग कर इस जबकि देखा, .m फ़ाइल अब शीर्ष पर खाली वर्ग है फाइल का अतीत में जब श्रेणियों के बारे में सीखते हुए मैंने देखा कि कुछ लोग निजी तरीकों को इंगित करने के लिए इसी तकनीक का उपयोग करेंगे (हालांकि वास्तव में निजी नहीं)।

क्या यह इरादा यहां है? क्या चीजें वास्तव में निजी बनाने में कोई बदलाव आया है? मैं वहां @private निर्देश भी देखता हूं।

निजी वर्र्स और विधियों के बारे में आपकी व्यक्तिगत कोडिंग शैली क्या है?

अद्यतन: चूंकि एक्सकोड हमें कक्षा एक्सटेंशन का उपयोग करने के लिए प्रेरित कर रहा है, इसलिए मैं आगे बढ़ गया और इस परियोजना के लिए उन्हें निजी तरीकों/ivar के लिए उपयोग किया। हालांकि मुझे एक कमी मिली। मैंने देखा कि मैं अपने सबक्साइड यूआईवीव कंट्रोलर के साथ अपने सभी यूआईबूटन, उइलाबल्स इत्यादि के साथ पुन: उपयोग कर सकता हूं .... मेरे पास यह विरासत थी: UIViewController < - फर्स्ट व्यू कंट्रोलर < - सेकेंड व्यू कंट्रोलर।

खैर, जब मैं SecondViewController में कोड करता हूं तो मैं सभी निजी विधियों को प्रथम दृश्य नियंत्रक के वर्ग एक्सटेंशन में स्वतः पूर्ण नहीं करता हूं जब मैं द्वितीय दृश्य नियंत्रक में कोड करता हूं। एक मामूली झुंझलाहट ....

+0

रॉब की प्रतिक्रिया अच्छी थी लेकिन ... क्या किसी को कोई विचार है कि एक्सकोड केवल यूआईवीव कंट्रोलर के उप-वर्गों के लिए क्यों उत्पन्न करता है और सभी कक्षाएं नहीं? (यह कुछ अन्य लोगों के लिए ऐसा कर सकता है, लेकिन मेरे द्वारा विस्तारित सामान्य कक्षाएं इस व्यवहार को प्रदर्शित नहीं करती हैं।) – VaporwareWolf

उत्तर

19

आप इस इंटरफ़ेस परिभाषा की चर्चा करते हुए कर रहे हैं:

@interface MYViewController() 
@end 

यह तकनीकी रूप से एक वर्ग के विस्तार के बजाय एक वर्ग है। श्रेणियों में कोष्ठक के अंदर एक स्ट्रिंग है। वर्ग एक्सटेंशन संकलन समय पर कक्षा में जोड़े जाते हैं, और इसलिए इवर (आमतौर पर गुणों के रूप में) जोड़ सकते हैं। श्रेणियां रनटाइम पर जोड़े जाती हैं और आईवर नहीं जोड़ सकती हैं।

जो कुछ भी कहा गया, आपका बिंदु सही है। इसका उपयोग निजी तरीकों और गुणों को परिभाषित करने के लिए किया जाता है।

ओबीजेसी दुनिया में, "निजी" एक "कोई उल्लंघन नहीं" संकेत है, न कि एक रेजर-तार दीवार। जबकि @private कीवर्ड (जो कंपाइलर प्रवर्तन जोड़ता है) है, यह केवल इवर पर लागू होता है, और आम तौर पर आवश्यक नहीं है। इस प्रकार की चेतावनी-आधारित गोपनीयता ओबीजेसी में बहुत अच्छी तरह से काम करती है और काफी पर्याप्त है।

इस कक्षा विस्तार में अपनी निजी संपत्तियां रखें, और बाहर कॉल करने वालों को "चयनकर्ता का जवाब नहीं दे सकता" चेतावनी अगर वे उन्हें एक्सेस करने का प्रयास करें (जैसे वे किसी भी अपरिभाषित विधि को कॉल करने के लिए प्राप्त करेंगे)। आपको ओबीजेसी परियोजना में चेतावनियों को अस्तित्व में रखने की अनुमति नहीं देनी चाहिए, इसलिए यह डेटा encapsulation लागू करता है।


संपादित

यदि वे निजी रहे हैं, तो वे अपने उपवर्ग में पॉप नहीं करना चाहिए। आप जो चाहते हैं वह संरक्षित है। ओबीजेसी में संरक्षित तरीकों के लिए कोई अच्छी योजना नहीं है, लेकिन एक आम तकनीक उन्हें एक .h फ़ाइल में एक श्रेणी में रखना है जैसे MYViewController + Protected.h। मुझे लगता है कि यह अभ्यास में बहुत ही कम समय में आता है, क्योंकि बहुत अच्छा ओबीजेसी डिज़ाइन उप-वर्ग नहीं है। यह इसके बजाय संरचना और प्रतिनिधिमंडल का उपयोग करता है।

"केवल नियंत्रकों को क्यों देखें।" सबसे पहले, यह सिर्फ नियंत्रकों को नहीं देखता है। यह आईओएस (अच्छी तरह से, वीसी, टेबल व्यू कंट्रोलर, और जीएलकेवी कंट्रोलर) पर नियंत्रक देखें। मैक पर, यह विंडो नियंत्रक और स्पॉटलाइट आयातक भी है।इसमें देखें:

.../Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates 
.../Library/Xcode/Templates 

लेकिन क्यों? खैर, वे सभी नियंत्रक हैं, और यह नियंत्रकों के लिए निजी गुणों की आवश्यकता के लिए बेहद आम है। वास्तव में, यदि आपके पास नियंत्रक में निजी गुण नहीं हैं, तो आप शायद बहुत अधिक सार्वजनिक कर रहे हैं। यह मॉडल के सार्वभौमिक और कक्षाओं को देखने के रूप में नहीं है। मुझे संदेह है कि उनके निर्णय में खेला गया। यह अलग-अलग लोग भी हो सकते हैं जिन्होंने टेम्पलेट का स्वामित्व किया हो, या वे अलग-अलग समय पर अपडेट किए गए हों। कभी-कभी आप थोड़ी असंगतता देखते हैं जो समय के साथ चिकनी होती है।

आप अपने खुद के टेम्पलेट भी बना सकते हैं। Creating Custom Xcode 4 File Templates देखें।

+0

सही उत्तर। धन्यवाद! – VaporwareWolf

+0

@HCHogan अगर यह आपके प्रश्न का उत्तर दिया गया तो कृपया इसे उत्तर के रूप में चिह्नित करें (पोस्ट के बाईं ओर चिह्न चिह्नित करें)। धन्यवाद। – Stunner

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