我有一个应用程序,我已经开始添加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
}
答案 0 :(得分:1)
问题是不应直接创建域List
。此类仅用于管理Object
模型上的多对多关系。相反,您应该使用标准的Swift数组来存储未提供的Realm Objects
。
所以切换:
let todos = List<TodoTask>()
到
let todos = [TodoTask]()