Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift2 数组中的对象从不调用deinit?为什么和如何_Swift2 - Fatal编程技术网

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编程语言文档,特别是本章,尤其是“弱引用”部分