领域 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]()
我有一个应用程序,我已经开始向其中添加 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]()