在未使用对象的瞄准期间,Realm Swift EXC_BAD_ACCESS

时间:2015-10-04 19:45:46

标签: ios swift segue swift2 realm

我有一个应用程序,我已经开始添加Realm,我认为我一定做错了,因为我在视图控制器之间传递未经存在的对象时一直运行到EXC_BAD_ACCESS。

这是我的应用程序的精简版。

class TodoTask: Object {
    dynamic var name: String = ""
    let steps = List<Step>()

    convenience init(name: String) {
        self.init()
        self.name = name
    }
}

class Step: Object {
    dynamic var name: String = ""

    convenience init(name: String) {
        self.init()
        self.name = name
    }
}

class TodoListController: UIViewController {
    let todos = List<TodoTask>()

    override func viewDidLoad() {
        super.viewDidLoad()

        var t1 = TodoTask(name: "Todo1")
        let steps = [
            Step("Do this"),
            Step("Do that"),
        ]
        t1.steps.appendContentsOf(steps)

        var t2 = TodoTask(name: "Todo2")
        let steps = [
            Step("Do these"),
            Step("Do those"),
        ]
        t2.steps.appendContentsOf(steps)

        todos.appendContentsOf([t1, t2])
        // Display table of todos.
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let detailsController = segue.destinationViewController as? TodoDetailViewController,
            let selectedTask = getSelectedTask() {
            detailsController.task = selectedTask
        }
    }
}    

class TodoDetailViewController: UIViewController {
    var task: TodoTask?   // <<< EXC_BAD_ACCESS

    // Display the task's steps.
}

不幸的是,我无法弄清楚触发EXC_BAD_ACCESS的是什么,它会间歇性地发生。我没有复制一个堆栈跟踪(噢喔!)但我记得它在某些Row对象的C ++析构函数中。这对我来说很奇怪,因为我的Documents文件夹中似乎没有数据库文件。

我非常有信心这是一个基于Realm的错误,因为在我将普通的Swift对象转换为Realm对象之前,我没有遇到任何奇怪的崩溃。

我唯一的预感是我可能使用List错误,因为警告This method can only be called during a write transaction.appendContentsOf方法的注释中。但是,我的印象是我可以使用未存储在Realm中的Realm对象,就像普通的Swift对象一样。

我使用Realm对象错了吗?还有什么我可以研究的吗?

我在境界0.95.2。

谢谢!

编辑:

func getSelectedTask() -> TodoTask? {
    if let index = taskTableView.indexPathForSelectedRow {
        return tasks[index]
    }
    return nil
}

1 个答案:

答案 0 :(得分:1)

问题是不应直接创建域List。此类仅用于管理Object模型上的多对多关系。相反,您应该使用标准的Swift数组来存储未提供的Realm Objects

所以切换:

let todos = List<TodoTask>()

let todos = [TodoTask]()