无法弄清楚为什么对象过早被解除分配

时间:2014-10-02 17:36:10

标签: ios swift

我正在实现一个非常简单的表视图。

创建视图时,代码如下:

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”一次并将其释放两次。

有人可以帮忙吗?

谢谢,

大卫

2 个答案:

答案 0 :(得分:0)

您需要以某种方式保留数据源,而tableView对其dataSource属性的弱引用是不够的。一旦selectFolder中的局部变量超出范围,数据源就会被释放。

这个问题的一个非常常见的解决方案是在selectFolder所在的类中放置一个强属性,并将数据源分配给该属性,以便它可以保留。

答案 1 :(得分:-1)

表视图具有对数据源的弱引用。由于您传入数据源,并且在方法结束后没有其他对象强烈保留它,因此将取消分配。也许子类UITableViewController具有强大的数据源属性,因此会有一个强引用。