要么我做错了什么,要么我在 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 场景:
然后,我选择每个 NSTableCellView 的 NSTextField 并向其添加此绑定(bind)配置:
当我开始构建项目时,它构建得很好,直到它到达挂起的 Storyboard的编译为止。一个名为 ibtoold 的进程启动,它很快就会开始使用大量内存。
即使我停止从 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/