के साथ अपने स्वयं के समापन ब्लॉक में एनएसओपरेशन ऑब्जेक्ट को संदर्भित करना मुझे कुछ एनएसओपरेशन कोड को एआरसी में परिवर्तित करने में कठिनाई हो रही है। मेरा ऑपरेशन ऑब्जेक्ट एक समापन ब्लॉक का उपयोग करता है, जिसमें बदले में एक जीसीडी ब्लॉक होता है जो मुख्य थ्रेड पर यूआई अपडेट करता है। क्योंकि मैं अपने ऑपरेशन ऑब्जेक्ट को अपने स्वयं के समापन ब्लॉक के अंदर से संदर्भित करता हूं, इसलिए मैं मेमोरी लीक से बचने के लिए __weak पॉइंटर का उपयोग कर रहा हूं। हालांकि, मेरे कोड के चलते पॉइंटर पहले से ही शून्य हो गया है।एआरसी
मैंने इसे इस कोड नमूना में संकुचित कर दिया है। किसी को पता है कि मैं गलत कहां गया, और इसे पूरा करने का सही तरीका?
NSOperationSubclass *operation = [[NSOperationSubclass alloc] init];
__weak NSOperationSubclass *weakOperation = operation;
[operation setCompletionBlock:^{
dispatch_async(dispatch_get_main_queue(), ^{
// fails the check
NSAssert(weakOperation != nil, @"pointer is nil");
...
});
}];
अच्छा, क्या गलत हुआ यह है कि एक कमजोर पॉइंटर स्वामित्व नहीं रखता है। यदि परिवर्तनीय (और वहां नहीं है) रखने के अलावा कुछ और नहीं है, तो इसे शुद्ध किया जा रहा है। क्या आप सुनिश्चित हैं कि यदि आप 'ऑपरेशन' का उपयोग करते हैं तो आपको रिसाव मिलती है? ऐसा लगता है कि पूरा होने पर ब्लॉक गायब हो जाना चाहिए, जिसे इसे जल्द ही कहा जाना चाहिए। (हालांकि यह मूर्ख हो सकता है।) –
एआरसी संकलन समय पर इसके बारे में शिकायत कर रहा था। इसके बिना मैं सीधे ऑपरेशन पॉइंटर का उपयोग कर रहा था (और मुझे विश्वास नहीं है कि मैं स्मृति लीक कर रहा था)। –
इसके साथ शुभकामनाएँ। मुझे लगता है कि छोड़ने और कुछ और करने से पहले मैंने कई घंटों तक इसके खिलाफ संघर्ष किया था। लेकिन यह थोड़ी देर हो गया है। :) –