2011-12-27 12 views
5

मुझे पता है कि एक ब्लॉक उद्देश्य-सी में निष्पादन योग्य कोड का एक पुन: प्रयोज्य हिस्सा है। क्या कोई कारण है कि मुझे फ़ंक्शन में कोड का एक ही हिस्सा नहीं डालना चाहिए और जब मुझे उस कोड को चलाने की आवश्यकता होती है तो केवल फ़ंक्शन कहा जाता है?उद्देश्य-सी में कार्यों पर ब्लॉक का उपयोग करने का कोई फायदा है?

उत्तर

14

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

int num1 = 42; 
void (^myBlock)(void) = ^{ 
    NSLog(@"num1 is %d", num1); 
}; 

num1 = 0; // Changed after block is created 

// Sometime later, in a different scope 

myBlock();    // num1 is 42 

तो बस चर संख्या 1 का उपयोग करके, समय myBlock पर अपने मूल्य परिभाषित किया गया था पर कब्जा कर लिया है।

से एप्पल के documentation:

  1. वे आपको मंगलाचरण का मुद्दा यह है कि है पर कोड लिखने की अनुमति देते हैं:

    ब्लाकों एक उपयोगी दो मुख्य कारण के लिए पारंपरिक कॉलबैक कार्यों के लिए विकल्प हैं विधि कार्यान्वयन के संदर्भ में बाद में निष्पादित किया गया। ब्लॉक हैं, इस प्रकार फ्रेमवर्क विधियों के पैरामीटर अक्सर।

  2. वे स्थानीय चर के लिए उपयोग की अनुमति है। कॉलबैक एक डेटा संरचना है कि सभी प्रासंगिक जानकारी आप एक कार्रवाई करने के लिए की जरूरत का प्रतीक की आवश्यकता होती है का उपयोग कर के बजाय, आप बस स्थानीय चर सीधे पहुंचें।

+0

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

+0

हां, यह सच है, लेकिन ऐसे कई मामले हैं जहां किसी विधि को अतुल्यकालिक रूप से कुछ करने के लिए समय चाहिए, और मुख्य धागे को अवरुद्ध किए बिना ऐसा करता है (आवश्यक रूप से केवल मल्टीथ्रेडिंग नहीं, NSRunLoop देखें)।ऐसे एप्लिकेशन हैं जहां एक ही विधि कभी-कभी सिंक्रनाइज़ हो सकती है और इसे लौटने से पहले समापन ब्लॉक को कॉल कर सकती है, और अन्य बार असीमित रूप से चलती है। अलग-अलग (कॉलिंग) कोड लिखने के बिना दोनों संभावनाओं की अनुमति देना अच्छा होता है। एक और बात यह है कि समापन ब्लॉक में अक्सर तर्क होते हैं, जो अनिवार्य रूप से कई मानों को वापस करने की विधि के लिए अनुमति देता है। –

+0

डब्ल्यूडब्ल्यूडीसी 2011 ("प्रैक्टिस में ब्लॉक और जीसीडी") से सत्र 308) सॉर्टिंग के साथ करने के लिए एक अच्छा उदाहरण के साथ सामान्य कार्यों (जैसे इस जवाब में शामिल) पर ब्लॉक के फायदे पर प्रकाश डाला गया है। – Aky

4

के रूप में जवाब में ब्रैड लार्सन टिप्पणी this answer रहे हैं:

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

एक अच्छा उदाहरण है जिनमें से मैं आप दे सकते हैं चेतावनी को देखने के है, यह अच्छा होगा अगर मैं चेतावनी को देखने के निर्माण के समय का फैसला किया है कि क्या होगा जब मैं कि खारिज करेगा बजाय मैं प्रतिनिधि विधि लिख सकते हैं और के लिए प्रतीक्षा कॉल करने के लिए। तो यह समझना और कार्यान्वित करना बहुत आसान होगा और यह तेजी से प्रसंस्करण प्रदान करता है।

+4

कृपया बातें plagiarize नहीं है दूसरों उचित प्रशस्ति पत्र के बिना कहीं लिखा है। यह आपको इस साइट से बहुत जल्दी निलंबित कर देगा। –

+0

हाँ..मैं भविष्य में ऐसा करूँगा ... शायद हाल ही में यह याद किया जा सकता है .. – rishi

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

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