एआरसी का उपयोग करते हुए 4.0 और 5.0 को लक्षित करने वाले आईओएस प्रोजेक्ट पर काम करना।एआरसी, ब्लॉक और चक्र बनाए रखें
ब्लॉक, एआरसी से संबंधित किसी मुद्दे में चलना और ब्लॉक के बाहर से किसी ऑब्जेक्ट का संदर्भ देना। यहाँ कुछ कोड है:
__block AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlock:^ {
if ([operation isCancelled]) {
return;
}
... do stuff ...
operation = nil;
}];
इस मामले में, संकलक एक चेतावनी है कि ब्लॉक में 'आपरेशन' का उपयोग कर एक चक्र बनाए रखने के लिए नेतृत्व करने के लिए जा रहा है देता है। एआरसी के तहत, __block अब चर को बरकरार रखता है।
यदि मैं __unsafe_unretained जोड़ता हूं, तो संकलक तुरंत ऑब्जेक्ट को रिलीज़ करता है, इसलिए स्पष्ट रूप से यह काम नहीं करेगा।
मैं 4.0 को लक्षित कर रहा हूं इसलिए मैं __weak का उपयोग नहीं कर सकता।
मैं कुछ इस तरह कर रही करने की कोशिश की:
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
__block __unsafe_unretained AFHTTPRequestOperation *weakOperation = operation;
लेकिन जब weakOperation नहीं के बराबर नहीं है, यह से कोई भी गुण जब ब्लॉक के अंदर भर जाती है है।
ऊपर सूचीबद्ध परियोजना बाधाओं को देखते हुए इस स्थिति को संभालने का सबसे अच्छा तरीका क्या है?
मुझे अपने दिमाग में 'कोई बरकरार चक्र' चीज नहीं मिली है, मैंने आपके द्वारा वर्णित तरीके से इसके बारे में भी सोचा नहीं था। ओह। अगला प्रश्न - संकलक चेतावनी को चुप करने का कोई तरीका? यह मुझे पागल ड्राइव करेगा। – Hunter
क्लैंग उपयोगकर्ता के मैनुअल में ["प्रगति के माध्यम से डायग्नोस्टिक्स नियंत्रित करना]] (http://clang.llvm.org/docs/UsersManual.html#diagnostics_pragmas) देखें। आपको केवल यह पता लगाने की आवश्यकता होगी कि किस चेतावनी ध्वज को अनदेखा करना है। –
यह '#pragma क्लैंग डायग्नोस्टिक अनदेखा "-वर्स-रिटेन-साइकिल" 'द्वारा, द्वारा किया गया है। –