उद्देश्य-सी में `वनवे शून्य` का उपयोग-मामला?


107

मुझे NSObject.h में एक अजीब कीवर्ड मिला

- (oneway void)release;

मैंने वेब पर खोज की, और सीखा कि यह एसिंक्रोनस संदेश पासिंग से संबंधित है, जो एरलंग के संदेश के गुजरने के साथ समान है।

ऐसा लगता है कि यह कई दिलचस्प चीजें कर सकता है। इस खोजशब्द के कुछ अच्छे उपयोग के मामले क्या हैं?


5
याद रखने में आसान: oneway voidउन खूबसूरत आकस्मिक उपमाओं में से एक है जिन्हें हम कभी-कभी मृत्यु के लिए इस मामले में कोडिंग में देखते हैं। "अगर दूसरी तरफ कुछ है, तो हमें मत बताना।"
निर्मित

जवाबों:


111

onewayवितरित ऑब्जेक्ट API के साथ उपयोग किया जाता है, जो विभिन्न थ्रेड्स या एप्लिकेशन के बीच ऑब्जेक्टिव-सी ऑब्जेक्ट्स के उपयोग की अनुमति देता है। यह सिस्टम को बताता है कि उसे कॉलिंग थ्रेड को ब्लॉक नहीं करना चाहिए जब तक कि विधि वापस न आ जाए। इसके बिना, कॉलर ब्लॉक हो जाएगा, भले ही विधि का रिटर्न प्रकार शून्य हो। जाहिर है, यह शून्य के अलावा किसी भी चीज़ के साथ प्रयोग नहीं किया जाता है, क्योंकि ऐसा करने का अर्थ होगा कि विधि कुछ लौटाती है, लेकिन कॉल करने वाले को यह नहीं मिलता है।

वितरित वस्तुओं के बारे में अधिक जानने के लिए, कोको कॉन्सेप्चुअल डिस्ट्रॉक्टऑब्जेक्ट देखें ।


6
लिंक अब काम नहीं करता है। मैं इसे Apple के डॉक्स के भीतर नहीं ढूंढ सका लेकिन मैंने पाया: chachatelier.fr/programmation/fichiers/cpp-objc-en.pdf जो "ऑनवे" कीवर्ड की अच्छी व्याख्या प्रदान करता है। खंड 4.4.5 (पीडीएफ पेज 24) देखें
jlmendezbonini

@ रोबिन अपडेट के लिए धन्यवाद। यह पिछले कुछ महीनों के लिए चला गया था, लेकिन मुझे Apple से एक और संदर्भ नहीं मिला, इसलिए मैंने इसे छोड़ दिया।
ughoavgfhw

और मुझे लगा कि नेटवर्क कार्यों को आग लगाने का एकमात्र तरीका उन्हें उप-थ्रेड करना है ... gcd_async और उसके दोस्तों का उपयोग करना ..
नीरव भट्ट

18

एप्पल के प्रलेखन के अनुसार वनवे केवल वितरित वस्तु (और मल्टीथ्रेडिंग के लिए नहीं) के लिए उपयोग किया जाता है।

यदि ऑब्जेक्ट दूरस्थ है, तो oneway संशोधक का उपयोग किया जाता है। इस स्थिति में रिलीज़ कॉल एसिंक्रोनस रूप से वापस आ सकती है (विधि समाप्त होने से पहले)। एक नेटवर्क में यह समझ में आता है क्योंकि वापसी संदेश की प्रतीक्षा में कुछ समय लग सकता है।

रिलीज़ विधि का कोई रिटर्न मान नहीं है और इसलिए कॉल करें इसे एसिंक्रोनस रूप से निष्पादित किया जा सकता है। इसके विपरीत, रिटेन और ऑटोरेलिज एक आईडी लौटाते हैं और इसलिए हमें पूरे नेटवर्क में वापसी संदेश के लिए इंतजार करना पड़ता है।


मेरे पास एक संबंधित प्रश्न है: यदि onewayकीवर्ड का उपयोग करने से संदेश कॉलिंग थ्रेड को ब्लॉक नहीं करता है जबकि कॉल की गई विधि निष्पादित होती है, तो यह कॉलिंग विधि को दूसरे थ्रेड पर निष्पादित करने के लिए बनाता है। क्या यह मल्टीटास्किंग (सरलतम रूप में) नहीं है? क्या मैं इसका उपयोग कुछ छोटे परिचालनों को जल्दी से (बिना अधिक प्रयास के) दूसरे धागे से अलग करने के लिए कर सकता हूं ? आपका बहुत बहुत धन्यवाद।
कॉन्सटेंटिनो ज़ारौहास

1
नहीं, आप नहीं कर सकते। वितरित कंप्यूटिंग में धागे को एक अलग मशीन / प्रक्रिया में निष्पादित किया जाता है। आप performSelector का उपयोग कर सकते हैं: onThread: withObject: WaitUntilDone: अपने उद्देश्य के लिए।
फ्रीमैन

2
तो - (oneway void) releaseफिर क्या होता है ? यह दूसरी मशीन या प्रक्रिया पर नहीं है।
कॉन्सटेंटिनो ज़ारौहास

+1 यह स्पष्ट करने के लिए कि वास्तव में एक तरीका क्या है -> one wayएक विधि को परिभाषित करने का अर्थ है कि don't wait for the method to complete and return anything. block it if there is any n/w trafic or so. क्या मुझे कोई मतलब है?
thesummersign
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.