यहाँ बनाए रखने के अपने कस्टम दृश्य हैस्विफ्ट चक्र स्पष्टीकरण
class ViewControllerB: UIViewController {
var customView: CustomVIew!
deinit {
print("B deinit")
}
override func viewDidLoad() {
super.viewDidLoad()
let customView = CustomVIew()
customView.onTapViewHandler = { [unowned self] in
self.didTapBlue()
}
customView.frame = CGRect(x: 50, y: 250, width: 200, height: 100)
customView.backgroundColor = UIColor.blueColor()
view.addSubview(customView)
self.customView = customView
}
func didTapBlue() {
}
}
जब नियंत्रक नेविगेशन ढेर से पॉप है, सब कुछ ठीक है:
B deinit
custom view deinit
लेकिन जब मैं इस कोड को प्रतिस्थापित करता हूं:
customView.onTapViewHandler = { [unowned self] in
self.didTapBlue()
}
इस के साथ
:
customView.onTapViewHandler = didTapBlue
तो, कुछ भी कंसोल पर छपा है। कस्टम व्यू और व्यू कंट्रोलर जारी नहीं किए जाते हैं, क्यों?
customView.onTapViewHandler = didTapBlue
self
का संदर्भ कैप्चर क्यों करता है?
आप जानते हैं कि यह पहले से क्यों नहीं है? आपका शीर्षक कहता है कि यह सर्कल बनाए रखता है ... इसे प्रिंट करके संदर्भ गणना की जांच करें: प्रिंट (CFGetRetainCount (ऑब्जेक्ट)) – Surely
@ निश्चित रूप से आप 'CFGetRetainCount' को 'बनाए रखने' के आसपास काम करने के लिए सुझाव देते हैं। लेकिन एक कारण है कि 'बनाए रखना' बहिष्कृत किया गया है: यह एक अच्छा समाधान नहीं है। – Abizern
यह सिर्फ एक जांच विधि है। मेरा मतलब है कि आप संदर्भों की मात्रा को मुद्रित कर सकते हैं जो नियंत्रक को संदर्भित किया गया है ताकि आप जान सकें कि "customView" दृश्य नियंत्रक के लिए एक मजबूत संदर्भ है या नहीं। यदि यह है, तो एक बरकरार चक्र है। क्योंकि इसमें एक सतत चक्र है, इसलिए दो ऑब्जेक्ट स्वचालित रूप से नष्ट नहीं हो सकते हैं। – Surely