让我们从这个游乐场示例开始
示例1
import UIKit
internal final class TestClass1 {
var testVar: Int = 1
internal init() {
print("TestClass1 init is called!")
}
deinit {
print("TestClass1 deinit is called!")
}
internal func func1() {
print("func1 is called!")
}
}
internal final class TestClass2 {
init() {
let testClass1: TestClass1 = TestClass1()
testClass1.testVar = 10
}
}
var testClass2: TestClass2 = TestClass2()
输出
TestClass1初始化被调用!
TestClass1 deinit被调用!
示例2
import UIKit
internal final class TestClass1 {
internal final var funcPointer: (() -> ())!
internal init() {
self.funcPointer = self.func1
print("TestClass1 init is called!")
}
deinit {
print("TestClass1 deinit is called!")
}
internal func func1() {
print("func1 is called!")
}
}
internal final class TestClass2 {
init() {
let testClass1: TestClass1 = TestClass1()
testClass1.funcPointer()
}
}
var testClass2: TestClass2 = TestClass2()
输出
TestClass1初始化被调用!
func1被调用!
我的问题是,示例2中从未调用过deinit()
方法。我认为有一个保留周期,但是我不知道如何解决它。
答案 0 :(得分:3)
要修复此问题,您必须通过弱者调用func1。
internal init() {
self.funcPointer = { [weak self] in
self?.func1()
}
print("TestClass1 init is called!")
}
这样,您可以防止保留周期。
此刻发生的事情是,您正在将实例函数分配给实例属性,该实例属性现在对您的函数有很强的引用。
希望这会有所帮助。