2011-10-31 9 views
5

एक कंपाइलर (विशेष रूप से संकलक जो एक्सकोड का उपयोग करता है) के प्रदर्शन लाभ क्या हैं प्रत्येक चर को __block चर के रूप में नहीं मानते? मैं कल्पना करता वहाँ कुछ हो गया है, मुझे शक है कि __block चर के गर्भाधान के दौरान यह निर्णय लिया गया किक्या कारण है कि एक कंपाइलर प्रत्येक चर को __block चर के रूप में नहीं मानता है?

__block SelfClass * blockSelf = self; 

अच्छा और सुविधाजनक वाक्य रचना है।

उत्तर

4

ब्लॉक का लक्ष्य इसे न्यूनतम वाक्यविन्यास वाले ब्लॉक का उपयोग करने के लिए जितना संभव हो सके स्वचालित और पारदर्शी बनाना था और उन्हें "बस काम करना" था।

गैर-ब्लॉक ब्लॉक वैरिएबल, डिफ़ॉल्ट के रूप में, ब्लॉक को "बंद करने" की धारणा के अनुरूप बहुत अधिक हैं। एक ब्लॉक ब्लॉक घोषणा के दौरान निष्पादन के समय ब्लॉक के भीतर संदर्भित सभी चरों की स्थिति को स्नैपशॉट करता है। इसमें स्मृति/राज्य की प्रतिलिपि बनाने और ब्लॉक में कब्जा कर लिया गया कोई भी उद्देश्य-सी ऑब्जेक्ट संदर्भ शामिल है।

__block प्रभावी रूप से ब्लॉक के भीतर राज्य के encapsulation तोड़ता है। बहुत उपयोगी है, लेकिन प्रोग्रामर के हिस्से पर ऑब्जेक्ट संदर्भों के मैन्युअल प्रबंधन की आवश्यकता है।

आईई। गैर -__ ब्लॉक वैरिएबल "बस काम करते हैं" अधिकतर __block चर और, इस प्रकार, डिफ़ॉल्ट व्यवहार "बस काम करता है" के लिए गुरुत्वाकर्षण करना था।

प्रैक्टिस में, ब्लॉक के भीतर राज्य को कैप्चर करने की लागत आमतौर पर न्यूनतम होती है। ऐप प्रदर्शन पर मापनीय प्रभाव आम तौर पर दुर्लभ होता है और अक्सर अधिक गहन प्रकृति की वास्तुशिल्प समस्या को इंगित करता है।


हैं द्वारा:

__block SelfClass * blockSelf = self; 

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

0

क्योंकि __block स्टैक विनाश से बच सकता है। यह केवल ध्यान देने योग्य C++ साथ scoped चर हो जाएगा:

{ 
    __block shared_ptr<A> ptr = make_shared(new A); 
    self.some_block = ^(void){}; 
} // ptr will not be deleted until the block is destructed 
{ 
    shared_ptr<A> ptr = make_shared(new A); 
    self.some_block = ^(void){}; 
} // ptr will be deleted here 

यह भी कचरा संग्रहण लेकिन इसके उदाहरण बहुत कम ध्यान देने योग्य और कठिन बनाने के लिए साथ साफ दिखती है।

+0

काफी नहीं; दोनों मामलों में, ब्लॉक एक ढेर स्कॉप्ड ब्लॉक है और इस प्रकार, इस क्षेत्र के साथ नष्ट हो जाएगा। आपको ब्लॉक को प्रतिलिपि बनाने के लिए ब्लॉक की प्रतिलिपि बनाना है। साथ ही, यह '__block' का एक छोटा सा विवरण है; वहां कई अन्य ड्राइविंग कारक हैं। – bbum

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