我正在实现一个非常简单的表视图。
创建视图时,代码如下:
func selectFolder(path: String) {
var folderViewController = UITableViewController()
var dataSource = folderViewData(path: path)
folderViewController.tableView!.dataSource = dataSource // note I've confirmed that tableView is instantiated at this point
navController.pushViewController(folderViewController, animated: true)
}
我的数据来源非常简单; init()看起来像这样:
class folderViewData: NSObject, UITableViewDataSource, UITableViewDelegate {
var rootFolder:String
init(path:String) {
rootFolder = path
DPLog("initializing folderViewDelegate")
super.init()
}
<dataSource methods snipped>
}
运行此命令时,由于引用了已释放的对象,我收到错误。当我运行Instruments寻找僵尸时,我收到了这个错误:
将Objective-C消息发送到已解除分配的消息 'dpScheme.folderViewData'对象(僵尸)地址:0x7ff6516f5cf0。
我无法弄清楚如何以纯文本形式获取乐器信息,而且我没有足够的声誉来发布图像。简短的描述是方法“selectFolder”保留“folderViewData”一次并将其释放两次。
有人可以帮忙吗?
谢谢,
大卫
答案 0 :(得分:0)
您需要以某种方式保留数据源,而tableView对其dataSource属性的弱引用是不够的。一旦selectFolder
中的局部变量超出范围,数据源就会被释放。
这个问题的一个非常常见的解决方案是在selectFolder
所在的类中放置一个强属性,并将数据源分配给该属性,以便它可以保留。
答案 1 :(得分:-1)
表视图具有对数据源的弱引用。由于您传入数据源,并且在方法结束后没有其他对象强烈保留它,因此将取消分配。也许子类UITableViewController具有强大的数据源属性,因此会有一个强引用。