Xcode 7 内存泄漏

标签 xcode swift macos cocoa cocoa-bindings

要么我做错了什么,要么我在 Xcode 7 上发现了严重的内存泄漏。
我正在尝试制作一个简单的 OS X 应用程序,它使用绑定(bind)从对象数组更新 TableView 。
我创建了这个简单的模型:

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 中,我指定一个 Episodes 数组,并在 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.
        }
    }


}

然后,我向 Storyboard 添加一个包含 5 列的 TableView ,其中 Episode 类的每个属性各 1 列。我使用以下配置将 NSArrayController 添加到 View Controller 场景:

Array Controller Config Array Controller Config

然后,我选择每个 NSTableCellView 的 NSTextField 并向其添加此绑定(bind)配置:

NSTextField Binding

当我开始构建项目时,它构建得很好,直到它到达挂起的 Storyboard的编译为止。一个名为 ibtoold 的进程启动,它很快就会开始使用大量内存。

ibtoold process leaks

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

我做错了什么或者这是一个错误?如果我做错了什么,那是什么,如果没有,我该如何修复这个简单的应用程序?
感谢您抽出时间。

最佳答案

在您的类上添加 deinit 并查看控制台上是否出现 deinitialized 消息。

    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")
        }
    } 

关于Xcode 7 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34223008/

相关文章:

清理相机 osx 和 opencv

swift - 带有 Swift Cocoa 框架的 macOS 命令行工具 : Library not loaded

ios - "memory history"命令到底是什么?

ios - 更改 NSString 的字体大小并加载到 TextView 中

ios - Swift - 如何在单元测试中禁用网络

python - Mavericks 之后 Pandas 找不到 dateutil.parser

xml - 从命令行列出 XML 节点的 XPath

ios - 使用我的 ViewController 作为 TabBarController

swift - 在 Swift 中不大于运算符!>

xcode - Swift distance() 方法抛出 fatal error : can not increment endIndex