नहीं, self
को तब तक नहीं रखा जाएगा जब ब्लॉक में न तो (ए) self
पर कोई स्पष्ट संदर्भ हो; न ही (बी) self
के किसी भी अंतर्निहित संदर्भ जो self
के किसी भी आवृत्ति चर के संदर्भ में उत्पन्न होते हैं। dispatch_async
के आवेषण में self.queue
की उपस्थिति इसे बनाए रखने का कारण नहीं बनती है। यह महत्वपूर्ण है कि ब्लॉक के अंदर क्या है।
यह प्रदर्शित करना काफी आसान है। एक दृश्य नियंत्रक जिसका कार्यान्वयन की तरह लग रहा कल्पना कीजिए:
@interface SecondViewController()
@property (nonatomic, strong) dispatch_queue_t queue;
@end
@implementation SecondViewController
- (void)dealloc
{
NSLog(@"%s", __FUNCTION__);
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.queue = dispatch_queue_create("com.stackoverflow.17306228", 0);
void (^block)(void) = ^(void){
sleep(10);
NSLog(@"%s", __FUNCTION__);
};
dispatch_async(self.queue, block);
}
@end
आप इस दृश्य नियंत्रक के दृश्य करने के लिए धक्का, और फिर तुरंत इसे बंद पॉप "वापस" बटन दबाते हैं, आप दृश्य नियंत्रक तुरंत पुनः आवंटित की जाती किया जा देखेंगे, और ब्लॉक निष्पादित जारी रहेगा। लेकिन यदि आप block
पर क्लास इंस्टेंस वैरिएबल या प्रॉपर्टी जोड़ते हैं, तो ब्लॉक दृश्य पूरा होने तक आपको व्यू कंट्रोलर बनाए रखा जाएगा।
"ब्लॉक के लिए स्वयं को बनाए रखने" का अर्थ क्या है? क्या आपका मतलब है, "क्या स्वयं को बरकरार रखा जाता है क्योंकि मैं dispatch_async को अपनी कतार पारित कर रहा हूं?" – Wain