/ / ब्लॉक को स्वचालित बनाए रखना, क्या यह स्वयं में आइवर को भी प्रभावित करता है? - उद्देश्य-सी, स्मृति-प्रबंधन, उद्देश्य-सी-ब्लॉक

स्वत: बनाए रखने को अवरुद्ध करें, क्या यह स्वयं में इवरों को भी प्रभावित करता है? - उद्देश्य-सी, स्मृति प्रबंधन, उद्देश्य-सी-ब्लॉक

अगर मेरे पास क्लास है:

@interface A : NSObject
{
BOOL b;
id   c;
}
@end

और संदर्भ b तथा c एक ब्लॉक में, ब्लॉक रिटेन है self खुद ब खुद? या केवल b तथा c? के बारे में c, यह खुद को बनाए रखा जा सकता है, लेकिन कैसे b?

उत्तर:

जवाब के लिए 9 № 1

बिल का उत्तर बिल्कुल सही नहीं है:

अगर आपके पास इसका उदाहरण है A और उस उदाहरण के अंदर एक ब्लॉक बनाएं जैसे:

^{
b = YES;
}

फिर self बनाए रखा जाता है (जब ब्लॉक की प्रतिलिपि बनाई जाती है)। b है नहीं constबंद, क्योंकि b द्वारा दृढ़ता से संदर्भित है self, और केवल self है const ब्लॉक के दायरे में।

दूसरी ओर, यदि आप करते हैं:

BOOL aBool = YES;
^{
aBool = NO;
c = [[NSObject alloc] init];
}

तो फिर, self है constबंद (और बनाए रखा है जब ब्लॉक ही नकल की है) और करने के लिए काम c की अनुमति है। हालाँकि, असाइनमेंट को aBOOL है नहीं की अनुमति दी, क्योंकि के मूल्य aBool है const- बंद कर दिया।

दूसरे शब्दों में, संकलक पहचानता है b तथा c ivars हैं, और बरकरार रखेंगे self इसके बजाय सीधे आईवियर्स की।


इस बारे में सोचने का एक तरीका जो मुझे यह समझने में मदद करता है कि क्या चल रहा है यह याद रखना है कि एक वस्तु वास्तव में सिर्फ एक फैंसी संरचना है, जिसका अर्थ है कि आप तकनीकी रूप से तीर ऑपरेटर के माध्यम से आइवर का उपयोग कर सकते हैं: ->

इसलिए जब आप "आइवरी को एक्सेस कर रहे हैं:

b = YES;

है बराबर सेवा मेरे:

self->b = YES;

उस प्रकाश में, यह सही समझ में आता है क्यूं कर आपको बरकरार रखना होगा self, परंतु b नहीं है const। ये इसलिए b "बड़ी तस्वीर" का केवल एक पतला हिस्सा है, और पाने के लिए b, आप जरूरी सभी को शामिल करना चाहिए self के रूप में अच्छी तरह से (इस संदर्भ में वास्तव में कोई मतलब नहीं है) एक संरचना doesn के भाग की नकल के बाद से।


उत्तर № 2 के लिए 1

ब्लॉक से कोड उत्तर देने में सहायक होगा, लेकिन यह मानकर कि आपके पास ऐसा कुछ है;

^(A *a) {
[a doSomething];
}

a ब्लॉक द्वारा बनाए रखा जाएगा और ब्लॉक जारी होने पर जारी किया जाएगा। साधारण के बाहर कुछ भी साथ नहीं होगा b तथा c.

अगर आपके पास कुछ है;

^(id c, BOOL b) {
[c doSomethingElse];
}

फिर c ब्लॉक द्वारा बनाए रखा जाएगा और b एक के रूप में ब्लॉक द्वारा कब्जा कर लिया जाएगा const मान (यानी आपको करने के लिए एक कंपाइलर त्रुटि मिलेगी b = NO)

अधिक जानकारी के लिए डॉक्स देखें;

http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxVariables.html%23//apple_ref/doc/uid/TP40007502-CH6-SW1