निश्चित रूप से। यह वास्तव में असामान्य नहीं है, हालांकि आपको इसका एहसास नहीं हो सकता है।
उदाहरण के लिए, मान लें कि मेरा नियंत्रक नेटवर्क अनुरोध कर रहा है, और मैं वास्तव में यह सुनिश्चित करने की ज़रूरत है कि मैं प्रतिक्रिया को संभालता हूं, भले ही उपयोगकर्ता उस नियंत्रक से दूर हो गया हो।
मैं कुछ इस तरह कर सकते हैं:
- (void)doNetworkThing {
__block MyController *blockSelf = self;
NSURLRequest *request = // some request
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:
^(NSURLResponse *response, NSData *data, NSError *error) {
// Handle the response here
[blockSelf doThingWithResponse:response];
}];
}
यह परिचय एक छोटी सी चक्र जहां self
ही कारण बना हुआ है मजबूत सूचक blockSelf
को ही बताए द्वारा बनाए रखे जाने की बरकरार रहती है। blockSelf
तक दायरे से बाहर चला जाता है, स्वयं को हटाया नहीं जाएगा।
ध्यान दें कि अक्सर, आप इस स्थिति में एक कमजोर सूचक का उपयोग करेंगे। लेकिन यदि आपको वास्तव में नियंत्रक को इसे संभालने के लिए आसपास की आवश्यकता होती है, तो एक मजबूत सूचक भी काम करता है। जैसे ही हैंडलर ब्लॉक को हटा दिया जाता है, इसका संदर्भ blockSelf
पर जाएगा। चूंकि blockSelf
के ढेर संदर्भ को भी स्वयं इच्छा समाप्त कर दिया गया है, तो अगर कोई और इसे पकड़ नहीं रहा है तो उसे हटा दिया जाएगा।
तो मूल रूप से, blockSelf
एक अस्थायी बनाए रखने चक्र का कारण बन गया, जो यह सुनिश्चित करने में उपयोगी था कि अनुरोध समाप्त होने तक डेलोकेशन नहीं हो सका। क्योंकि एआरसी स्वचालित रूप से बनाए रखने की गणना को साफ़ करता है जब __block चर दायरे से बाहर हो जाता है, यह एक बनाए रखने चक्र की तरह नहीं दिखता है। लेकिन फिर भी, यही वह है।
स्रोत
2013-05-02 17:30:56
एक बेहतर समाधान नहीं होगा एक ivar या अन्य उपयुक्त चर का उपयोग कर एक मजबूत संदर्भ रखने के लिए? – rmaddy
सामान्य ज्ञान हाँ कहेंगे। लेकिन यही कारण है कि मैंने सवाल पूछा।शायद एक ऐसा मामला है जहां एक बनाए रखने चक्र (जैसे कि एक वस्तु स्वयं को बरकरार रखती है) बनाना सबसे अच्छा समाधान है। – MikeS
यह उत्तर देने का एक कठिन सवाल है क्योंकि यह बहुत खुला है। "कभी" या "कभी नहीं" और "सर्वश्रेष्ठ" वाले प्रश्नों का उत्तर अच्छी तरह से नहीं दिया जा सकता है। यदि आपके पास पूछने के लिए ठोस उपयोग केस था तो यह बेहतर होगा। – rmaddy