अगर मेरे पास क्लास है:
@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
)
अधिक जानकारी के लिए डॉक्स देखें;