यह एक अच्छा सवाल है। और ARC
का उपयोग करते समय उत्तर अनिवार्य रूप से है कि ब्लॉक स्वयं ऑब्जेक्ट को बरकरार रखता है, ताकि यह बाद में हो। यह उन सूक्ष्म स्मृति गॉटचास में से एक है। यदि UITableView
जिस से यह सेल आता है, उसे आवंटित किया जाता है और इसकी सभी कोशिकाओं को रिलीज़ किया जाता है, तो इसे बनाए रखा जाएगा (हालांकि ऑफ-स्क्रीन) और cell.imageView = image;
का कार्य पूरा हो जाएगा, फिर इसे जारी किया जाएगा।
मैं नियंत्रित प्रयोगों का एक बड़ा प्रशंसक हूं और इसका परीक्षण करने के लिए तैयार हूं, लेकिन UITableView
में कई चलती हिस्से हैं (कोई इरादा नहीं है)। तो मैं एक बहुत ही सरल प्रयोग बनाया गया है, इस प्रकार एक साधारण NSObject
उपवर्ग का उपयोग कर:
@implementation SayHello
-(void)sayHello{
NSLog(@"Hello");
}
-(void)dealloc{
NSLog(@"SayHello dead");
}
@end
जाहिर है इस वर्ग के लिए मुझे एक ब्लॉक (sayHello
) में कॉल करने के लिए एक समारोह देना है और एक NSLog
जब डी-आवंटित उत्पादन करेगा ।
मैं इस तरह अपने परीक्षण भागा:
SayHello *hello = [[SayHello alloc] init];
dispatch_async(dispatch_get_global_queue(0, 0), ^{
double delayInSeconds = 30.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[hello sayHello];
});
});
30 सेकंड यहां तक कि सबसे आलसी runloop समय "हैलो" वस्तु पुनःआवंटन (यदि, वास्तव में, यह नहीं रखा गया था) देता है। लेकिन उन 30 सेकंड के लिए कंसोल चुप है। 30 सेकंड की समयसीमा समाप्त होने के बाद मुझे तुरंत "हैलो" मिलता है जिसके बाद "SayHello मृत" संदेश मिलता है।
तो यह "गॉचा" कैसा है? खैर, जाहिर है अगर आपको एहसास नहीं होता कि ब्लॉक/एआरसी ऐसा कर रहे हैं, तो यह उन चीजों को ध्यान में रखकर समाप्त हो सकता है जिन्हें आपने सोचा था। लेकिन UITableViewCell
के आपके उदाहरण के साथ भी; क्या होगा यदि आपका सेल एक बार प्रदर्शित होता है और किसी छवि के लिए नेटवर्क पर अनुरोध भेजता है, लेकिन जब ब्लॉक छवि के लिए प्रतीक्षा कर रहा है तो सेल का पुन: उपयोग किया जाता है? अब उस सेल के संदर्भ में एक दूसरा ब्लॉक है जो इसकी छवि सेट करने का प्रयास कर रहा है। खैर, अब आपके पास एक दौड़ है जिसमें हारने वाला यह तय करेगा कि कौन सी छवि प्रदर्शित होती है।