5

का उपयोग करते समय ऑब्जेक्ट को कैसे रिलीज़ करें यह शायद स्मृति प्रबंधन के संबंध में एक नौसिखिया प्रश्न है।ब्लॉक कॉलबैक

उद्देश्य सी में कॉलबैक के रूप में ब्लॉक का उपयोग करते समय मैं ऑब्जेक्ट को कैसे जारी कर सकता हूं?

(अपडेट किया गया कोड)

@implementation ObjectWithCallback 
- (void)dealloc { 
    [_completionHandler release]; 
    [super dealloc]; 
} 
- (void)doTaskWithCompletionHandler:(void(^)(void))handler { 
    _completionHandler = [handler copy]; 
    // Start tasks... 
} 
- (void)tasksDone { 
    // Do callback block 
    _completionHandler(); 
    // Delete reference to block 
    [_completionHandler release]; 
    _completionHandler = nil; 
} 

// Use of the ObjectWithCallback 
ObjectWithCallback *request = [[ObjectWithCallback alloc] init]; 
[request doTaskWithCompletionHandler:^(void){ 
    // Callback called and task is ready. 
}]; 
+0

आप किस वस्तु को रिलीज़ करना चाहते हैं, और आप इसे ब्लॉक के भीतर क्यों नहीं छोड़ सकते? – Richard

+0

आपको क्या लगता है कि आप ब्लॉक में ऑब्जेक्ट को रिलायंस नहीं कर सकते हैं? – bbum

+0

वह 'अनुरोध' जारी करना चाहता है। – Caleb

उत्तर

11

त्वरित, अधूरा जवाब: [request autorelease]

इस के साथ समस्या यह है कि ब्लॉक परोक्ष किसी भी वस्तुओं है कि ब्लॉक के शरीर के अंदर संदर्भित बनाए रखने के लिए है। तो ब्लॉक request बनाए रखता है, और request ब्लॉक को बरकरार रखता है, जिससे एक बनाए रखा चक्र होता है और कोई भी हटा नहीं जाता है।

__block ObjectWithCallback *request = [[ObjectWithCallback alloc] init]; 

अनुशंसित पढ़ने:

+0

__block इस कैस में उपयोग नहीं किया जाना चाहिए। वस्तु का जीवन स्पष्ट रूप से ब्लॉक से जुड़ा हुआ है और ब्लॉक के बनाए रखने से यह सुनिश्चित होता है। – bbum

+0

@bbum मुझे लगता है कि मैं समझता हूं कि आपका क्या मतलब है, लेकिन यदि ब्लॉक संदर्भ 'अनुरोध' है तो क्या यह अभी भी एक चक्र बनाएगा? मुझे लगता है कि कॉल करने के बाद कॉलबैक ब्लॉक को रिलीज़ करने के लिए 'ऑब्जेक्ट विथकॉलबैक' के लिए एक तरीका है। –

+0

अहह - हाँ - ओपी के प्रश्न के लिए अलग-अलग मुद्दे ऑर्थोगोनल। Derp। – bbum