मैं एक्सकोड खेल के मैदान के साथ त्वरित बंद परीक्षण का परीक्षण कर रहा था। बंद से क्या उम्मीद है, एक आत्म निहित हैस्विफ्ट बंद क्यों स्वयं को पकड़ नहीं लेते?
import UIKit
class A{
var closure:()->() = {}
var name: String = "A"
init() {
self.closure = {
self.name = self.name + " Plus"
}
}
deinit {
print(name + " is deinit")
}
}
var a: A?
a = A()
a = nil
के रूप में, तो एक कभी नहीं जारी किया जाता है:
यह मेरा कोड है।
लेकिन, जब मैं अंतिम पंक्ति से पहले इस पंक्ति जोड़ें: फिर
a?.closure = { a?.name = "ttt" }
, मैंने पाया "एक deinit है" उत्पादन खिड़की है, जो एक जारी की है इसका मतलब है। क्यों? एक रीसायकल संदर्भ नहीं है?
परीक्षण होने के लिए, मैं एक समारोह का उपयोग बंद है, जो कोड संस्करण 2 है स्थापित करने के लिए:
import UIKit
class A{
var closure:()->() = {}
func funcToSetClosure(){
self.closure = { self.name = "BBB"}
}
var name: String = "A"
init() {
self.closure = {
self.name = self.name + " Plus"
}
}
deinit {
print(name + " is deinit")
}
}
var a: A?
a = A()
a?.funcToSetClosure()
a = nil
फिर, एक कभी नहीं जारी किया गया है।
तो मुझे निष्कर्ष मिला, जब बंद में कक्षा में एक समारोह या एक समारोह द्वारा बंद किया जाता है, तो यह रीसायकल संदर्भ का कारण बनता है, जब इसे कक्षा के बाहर सेट किया जाता है, तो यह रीसायकल संदर्भ नहीं देगा। क्या मैं सही हू?
आपकी मदद के लिए धन्यवाद, अंततः मैं समझता हूं, और एक्सकोड के मेमोरी ग्राफ के लिए भी धन्यवाद। –