मुझे एक ब्लॉक के बाहर से __block
(ब्लॉक म्यूटेबल) चर का उपयोग करने का प्रयास करते समय एक अजीब समस्या का सामना करना पड़ रहा है जिसमें इसे संशोधित किया गया है। यह एक बहुत ही खिलौना उदाहरण है कि मैं सिर्फ सामान्य रूप में ब्लॉक के एक बेहतर समझ पाने के उपयोग कर रहा हूँ है, लेकिन वर्तमान में मुझे लगता है कि एक NSDictionary
जो NSDictionary
के enumerateKeysAndObjectsUsingBlock:
Obj-C __block चर व्यवहार को बनाए रखने
- (NSString*) contentsOfDictionary:(NSDictionary*)dictionary
{
__block NSString *content = @"";
[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){
NSString* contentToAppend = [NSString stringWithFormat:@"Object:%@ for key:%@\n", obj, key];
content = [content stringByAppendingString:contentToAppend];
NSLog(@"Content in block:\n%@", content);
}];
NSLog(@"Content out of block:\n%@", content);
return content;
}
जब मैं एक शब्दकोश सामग्री युक्त के साथ इस विधि चलाएँ:
Value Key
"Queen" "card"
"Hearts" "suit"
"10" "value"
content
चर सही ढंग से ब्लॉक के भीतर संशोधित किया गया है और मैं एक यात्रा के साथ इस उत्पादन प्राप्त करें:
... ब्लॉक में सामग्री:
Object:Queen for key:card
... ब्लॉक में सामग्री: कोड कदम के रूप में जैसे ही
Object:Queen for key:card
Object:Hearts for key:suit
Object:10 for key:value
:
Object:Queen for key:card
Object:Hearts for key:suit
... ब्लॉक में सामग्री हालांकि ब्लॉक के बाहर, content
स्ट्रिंग तक पहुंचने से EXC_BAD_ACCESS
फेंकता है और एक रन अवसर पर ऐसा लगता है कि कुछ कचरा स्मृति मुद्रित हो सकती है (पुन: पेश नहीं कर सकती) ...
इस चर को जल्दी से हटाया जा रहा है? मैं इस धारणा के तहत था कि इसे __block
परिभाषा देने का मतलब यह होगा कि ब्लॉक के दौरान उपयोग किए जाने पर इसे बनाए रखा जाता है और जब ब्लॉक निकलता है तब जारी किया जाता है - लेकिन चर को एक स्ट्रिंग अक्षर होने के कारण से शुरू करने के लिए बनाए रखा जाता है और इसलिए मैं अपेक्षा करता हूं इस विधि को जल्द से जल्द बाहर निकलने तक इसे तब तक नहीं हटाया जाना चाहिए।
हाँ। ऐसा करता है। – donalbain