क्या कोई यह बता सकता है कि यह क्यों रिसाव नहीं करता है?स्विफ्ट - बंद करने में स्वयं को कैप्चर करने के बाद रिसाव की उम्मीद
मैं एक closure
भीतर self
पर कब्जा कर रहा हूँ तो मैं दो मजबूत संकेत एक दूसरे को इशारा कर दिया होता, इसलिए, deinit
संदेश नहीं कभी व्यक्ति वस्तु के लिए बुलाया जाना चाहिए।
सबसे पहले, यह मेरी कक्षा व्यक्ति है:
class Person {
var name: String
init(name: String) { self.name = name }
deinit { print("\(name) is being deinitialized") }
}
और ये मेरे ViewController के कार्यान्वयन है:
class ViewController: UIViewController {
var john:Person?
func callClosureFunction(closure:(name:Bool) ->()) {
closure(name: true)
}
override func viewDidLoad() {
super.viewDidLoad()
john = Person(name:"John")
self.callClosureFunction { (name) in
self.john?.name = "John Appleseed"
self.john = nil
// xcode prints - John Appleseed is being deinitialized
}
}
}
मैं कर समस्या का समाधान करने में सक्षम होने की उम्मीद कर रहा था:
self.callClosureFunction { [weak self] (name) in ...
लेकिन यह भी आवश्यक नहीं था। क्यूं कर?
'जॉन एप्लासेड' व्यक्ति का ऑब्जेक्ट अभी भी समाप्त हो जाएगा। मेरा उत्तर – Alexander
@AlexanderMomchliov देखें यदि बंदरगाह वीसी (स्वयं) को बरकरार रखता है और वीसी मेरे उदाहरण के रूप में बंद रहता है, तो वीसी कभी जारी नहीं होता है (न ही बंद हो जाता है)। यदि वीसी कभी खत्म नहीं होता है, तो यह कभी भी व्यक्ति वस्तु के संदर्भ को जारी नहीं करता है, जिसका अर्थ है कि व्यक्ति वस्तु कभी भी कम नहीं होती है। –
कोई फर्क नहीं पड़ता कि एक बरकरार चक्र है या नहीं। 'जॉन' स्पष्ट रूप से 'शून्य' पर सेट है, अंतिम संदर्भ को हटा रहा है, इस प्रकार एआरसी को इसे 'deinit' करने का कारण बनता है। – Alexander