领域 Swift EXC_BAD_ACCESS 在 Segue 与非持久化对象之间

Realm Swift EXC_BAD_ACCESS During Segue with Unpersisted Object

我有一个应用程序,我已经开始向其中添加 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,它会间歇性地发生。我没有复制堆栈跟踪(d'oh!)但我记得它在某种 Row 对象的 C++ 析构函数中。这对我来说很奇怪,因为我的文档文件夹中似乎没有数据库文件。

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

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

我是不是用错了 Realm 对象?还有什么我可以调查的吗?

我在 Realm 0.95.2 上。

谢谢!

编辑:

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

问题在于不应直接创建领域 List。此 class 仅用于管理 Object 模型上的多对多关系。相反,您应该使用标准 Swift 数组来存储未持久化的领域 Objects.

所以切换:

let todos = List<TodoTask>()

let todos = [TodoTask]()