Xcode 7内存泄漏

时间:2015-12-11 11:56:56

标签: xcode swift macos cocoa cocoa-bindings

要么我做了一些非常错误的事情,要么我在Xcode 7上发现了严重的内存泄漏 我正在尝试创建一个简单的OS X应用程序,它使用绑定从一组对象更新表视图 我创建了这个简单的模型:

class Episode: NSObject {
    var path: NSURL
    var series: String
    var season: Int
    var number: Int
    var name: String

    init(path:NSURL, series:String, season:Int, number:Int, name:String) {
        self.path = path
        self.series = series
        self.season = season
        self.number = number
        self.name = name
    }
}  

然后,在ViewController中我指定一个剧集数组并在viewDidLoad方法中添加两个项目

import Cocoa

class ViewController: NSViewController {

    var selectedEpisodes = [Episode]()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        selectedEpisodes.append(Episode(path: NSURL(string: "file:///")!, series: "Foo", season: 1, number: 1, name: "Foobar"))
        selectedEpisodes.append(Episode(path: NSURL(string: "file:///")!, series: "fOO", season: 10, number: 99, name: "fOObAR"))
    }

    override var representedObject: AnyObject? {
        didSet {
        // Update the view, if already loaded.
        }
    }


}

然后我将一个表视图添加到故事板中,其中包含5列,每个属性为Episode类1。我使用以下配置将NSArrayController添加到View Controller Scene:

Array Controller Config Array Controller Config

然后我选择每个NSTableCellView的NSTextField,并将此绑定配置添加到它:

NSTextField Binding

当我开始构建项目时,它构建得很好,直到它到达它挂起的故事板的编译。一个名为 ibtoold 的流程开始,它会很快开始使用大量内存。

ibtoold process leaks

即使我从Xcode停止编译,这个过程也不会停止。如果我不手动强制退出它,它会快速占用所有可用内存,直到整个系统崩溃。操作系统会暂停其他应用程序等,以便尝试保存您,但此时您只能强行重启计算机。

我是在做一些完全错误的事情,还是这个错误?如果我做错了什么,它是什么,如果没有,我该如何修复这个简单的应用程序? 谢谢你的时间。

1 个答案:

答案 0 :(得分:0)

在你的班级上添加deinit,看看是否在控制台上显示了未初始化的消息。

    class Episode: NSObject {
        var path: NSURL
        var series: String
        var season: Int
        var number: Int
        var name: String

        init(path:NSURL, series:String, season:Int, number:Int, name:String) {
            self.path = path
            self.series = series
            self.season = season
            self.number = number
            self.name = name
        }
        deinit {
            print("\(name) is being deinitialized")
        }
    }