2013-04-09 13 views
12

मैं सॉकेट प्रोग्रामिंग के साथ काम कर रहा हूं। मैं सिर्फ mobileorchard.com - Chatty से डाउनलोड किए गए कोड से संबंधित एक संदेह को साफ़ करना चाहता था। जबकि आर & डी, मैं ChatRoomViewController.m फ़ाइलहम क्यों कॉल करते हैं NotRecognizeSelector: विधि?

[chatRoom broadcastChatMessage:input.text fromUser:[AppConfig getInstance].name]; 

में एक समारोह कॉल देखा जब मैं में Room.m फ़ाइल को देखा, ऊपर कॉल के कार्यान्वयन के लिए; यह

- (void)broadcastChatMessage:(NSString*)message fromUser:(NSString*)name 
{ 
    // Crude way to emulate an "abstract" class 
    [self doesNotRecognizeSelector:_cmd]; 
} 

मैं "doesNotRecognizeSelector:" के लिए googled था, Apple के अनुसार अपनी त्रुटि से निपटने के लिए करते हुए कहा "। क्रम प्रणाली इस विधि जब भी एक वस्तु एक aSelector संदेश यह करने के लिए आगे उत्तर नहीं दे सकते या प्राप्त करता है invokes" मेरा सवाल यह है कि डेवलपर ब्रॉडकास्ट कैट मैसेज कहता है: यूज़र: फ़ंक्शन यदि इसका कोई उपयोग नहीं है और कौन सी विधि "चयनकर्ता नहीं मिला" अपवाद को संभालने के लिए?

Stackovrflow के अनुसार, इसका उपयोग Question के अनुसार, अमूर्त वर्ग बनाने के लिए किया जाता है, यह "अपूर्ण कार्यान्वयन" चेतावनी से बचने के लिए होता है।

मुझे अभी भी यह नहीं मिल रहा है कि उस विधि का उपयोग Chatty Code में क्यों किया जाता है, कृपया मुझे यह समझने में सहायता करें कि उस विधि का उपयोग क्यों किया जाता है।

+1

ऐसा लगता है कि एप्लिकेशन का मूल डेवलपर सी ++ अमूर्त बेस क्लास की विशेषताओं का अनुकरण करने का प्रयास कर रहा था, इसके उदाहरणों में यह अमान्य है। यह विधियों को बनाने के लिए एक और चरम रूप है, कुछ भी नहीं करता है या प्लेसहोल्डर मान (आमतौर पर 0 या NULL) वापस नहीं करता है। – CodaFi

उत्तर

11

यह विधि है जो हर NSObject व्युत्पन्न ऑब्जेक्ट पर मौजूद है जो एक अपवाद के पथ को ट्रिगर करता है जब किसी रनटाइम कॉल में कोई विधि पहचाना नहीं जाता है। उदाहरण के लिए, यदि आप NSString पर -foo नामक संदेश भेजने का प्रयास करते हैं, तो यह वहां समाप्त हो जाएगा क्योंकि यह NSString पर मान्य विधि नहीं है।

इस मामले में, चैटी क्लास Room एक बेस क्लास है जिसका उपयोग सीधे कभी नहीं किया जाता है। LocalRoom और RemoteRoom इससे निकलते हैं, और दोनों कक्षाएं -broadcastChatMessage:fromUser का एक ओवरराइडिंग कार्यान्वयन प्रदान करती हैं। कोई भी उस बेस क्लास संस्करण को कभी भी नहीं बुलाता है, लेकिन "पूर्णता" के लिए प्रोग्रामर ने गारंटी दी है कि एक सबक्लासर को विधि को लागू करके इसे ओवरराइड करना होगा, लेकिन उसके बाद मोड़ना और अपवाद को ट्रिगर करने के लिए इसे कॉल करना होगा।

बात यह है कि यह विशेष रूप से बेवकूफ उद्देश्य-सी नहीं है। एक "अमूर्त" वर्ग सी ++ और अन्य भाषाओं से अवधारणा है; यह आधार वर्ग है जो केवल "पैटर्न" के रूप में मौजूद है जिसमें से उप-वर्ग होना है। (ओबीजेसी में, अक्सर औपचारिक @protocol बनाकर किया जाता है जब सार्थक राज्य नहीं होता है, क्योंकि वहां (ज्यादातर) यहां नहीं है)।

ध्यान दें कि -doesNotRecognizeSelector: पर कॉल मनमाने ढंग से है। यहां कंपाइलर चेतावनियों से बचने के लिए जरूरी नहीं है (क्योंकि विधि वास्तव में कार्यान्वित की गई है) और मूल लेखक आसानी से सिर्फ अपवाद फेंक सकता था, या इसके बजाय कुछ भी नहीं कर सकता था।

4

ऐसा लगता है कि आपने पहले ही अपने प्रश्न का उत्तर दिया है। उद्देश्य-सी में अमूर्त वर्ग बनाने के लिए कोई विधि नहीं है, इसलिए इसे करने के लिए सबसे नज़दीकी चीज है जो आपको अपवादों को ओवरराइड करने के लिए आवश्यक है। यदि आप इस विधि को सबक्लास में ओवरराइड करते हैं, तो doesNotRecognizeSelector: अब कॉल नहीं किया जाएगा। असल में यह डेवलपर को अपने उप-वर्ग में इस विधि को लागू करने का वादा करने का एक तरीका है।

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

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