5

मान लीजिए कि मेरे पास एक साधारण कॉल dispatch_async(self.queue, ^{ /* Empty */ }) है, जहां self.queue पहले बनाई गई कतार है।क्या किसी ऑब्जेक्ट के स्वामित्व वाली किसी कतार में प्रेषण उस ऑब्जेक्ट को बनाए रखता है?

ब्लॉक है कि वहाँ कोई self संदर्भ अंदर है, लेकिन केवल dispatch_async() के लिए एक पैरामीटर के रूप इस मामले में ब्लॉक द्वारा बनाए रखा हो self, यह देखते हुए करता है?

+1

"ब्लॉक के लिए स्वयं को बनाए रखने" का अर्थ क्या है? क्या आपका मतलब है, "क्या स्वयं को बरकरार रखा जाता है क्योंकि मैं dispatch_async को अपनी कतार पारित कर रहा हूं?" – Wain

उत्तर

0

नहीं, 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 पर क्लास इंस्टेंस वैरिएबल या प्रॉपर्टी जोड़ते हैं, तो ब्लॉक दृश्य पूरा होने तक आपको व्यू कंट्रोलर बनाए रखा जाएगा।

2

ठीक है, तो सेब डॉक्स कहा गया है कि

कतार प्रणाली द्वारा बनाए रखा है जब तक ब्लॉक पूरा होने से समाप्त हो गया है।

तो कतार को सिस्टम द्वारा तब तक बनाए रखा जाएगा जब तक कि ब्लॉक निष्पादन को पूरा नहीं कर लेता है, लेकिन self इस मामले में बनाए रखा नहीं जाएगा।

इस उत्तर के पिछले संस्करण में मेरी गलती को इंगित करने के लिए @Wain के लिए धन्यवाद।

+1

कतार को बनाए रखने के परिणामस्वरूप 'स्वयं' को बनाए रखा गया है? – Wain

+0

मैंने शायद इस संदर्भ में गलत शब्दों का उपयोग किया है, कतार जारी होने तक 'स्वयं' को रिहा नहीं किया जा सकता/सौदा किया जा सकता है। यदि मैं गलत हूं तो मुझे सही करों। – danypata

+1

यकीन है कि यह कर सकते हैं। कतार 'स्वयं' के बिना मौजूद रह सकती है। प्रणाली वह चीज है जो कतार के निरंतर संदर्भ को 'रखती है'। – Wain

संबंधित मुद्दे