Swift2 数组中的对象从不调用deinit?为什么和如何
我在元素类和对象集类中定义了数组(元素)中的对象(元素)。Swift2 数组中的对象从不调用deinit?为什么和如何,swift2,Swift2,我在元素类和对象集类中定义了数组(元素)中的对象(元素)。 在我的例子中,objectSet对象和element对象从不调用deinit函数。请查看ViewController类中的“override func viewDidLoad()”函数。 如果我试图注释行“objectSet.elements.append(element)”,objectSet和element将调用deinit函数。为什么? 他们之间有紧密的联系吗?我该如何解决这个问题 我的代码: class ViewControll
在我的例子中,objectSet对象和element对象从不调用deinit函数。请查看ViewController类中的“override func viewDidLoad()”函数。
如果我试图注释行“objectSet.elements.append(element)”,objectSet和element将调用deinit函数。为什么?
他们之间有紧密的联系吗?我该如何解决这个问题 我的代码:
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
let objectSet = ObjectSet() //the objectSet is local variable
for idx in 0..<10 {
let element = Element(objectSet: objectSet, index: idx)
objectSet.elements.append(element) //try to comment this line the objectSet and element will call deinit function
}
}
}
class ObjectSet: NSObject {
var elements = [Element]()
deinit {
print("ObjectSet deinit")
}
}
class Element: NSObject {
var objectSet: ObjectSet
var index: Int
init(objectSet: ObjectSet, index: Int) {
self.objectSet = objectSet
self.index = index
super.init()
}
deinit {
print("Element\(self.index) deinit")
}
}
类ViewController:NSViewController{
重写func viewDidLoad(){
super.viewDidLoad()
让objectSet=objectSet()//objectSet是局部变量
对于0..中的idx,您在每个元素中持有一个objectSet
引用(作为属性),因此这是一个保留周期
尝试这样做:
class Element: NSObject {
weak var objectSet: ObjectSet?
var index: Int
init(objectSet: ObjectSet, index: Int) {
self.objectSet = objectSet
self.index = index
super.init()
}
deinit {
print("Element\(self.index) deinit")
}
}
更多信息见Swift 2.1编程语言文档,特别是本章,尤其是“弱引用”部分