我正在使用正在构建的应用程序遇到一种奇怪的行为。
我有一个结构Record
,我从NavigationViewController的子ViewController创建它的一个实例。
我们可以这样看:
NavigationController(名为TaskTabsController)
|
ViewController(称为TaskFromController)
如果我设置断点,我可以检查并检查对象的内容是否应该是什么(符合接口输入数据)。
但是当我在该实例(下一行)上调用方法时,不同的成员具有不同或缺少的值。
对象实例是在TaskTabsController中创建的,具体如下:
if let formVC = (viewControllers?[1] as? TaskFormViewController) {
let rec: TaskRecord? = formVC.makeTaskRecord()
// here the rec data are correct when I inspect the instance
rec?.prepareData()
// from the prepareData function, the properties are different of can't be accessed...
}
Ex:从控制器,我可以看到我的实例rec
有一个成员task
实例(Task
类型)且name
属性。
但是在prepareData
方法中,task
成员无法显示附加到其上的名称。 (调试器说价值不可读或类似的东西)
此外,我可以看到其他对象的列表,但在该方法中,它们的计数是不同的......
以下是makeTaskRecord方法的工作原理:(来自我的TaskFormViewController)
在TaskFormFiewController中,我有一个像这样的私有属性:
private var stepsSelected: [StepRecord] = []
该属性通过用户操作进行更新 StepRecord是一个结构。 (所以我认为应该通过价值传递)
接下来是同一个控制器中的makeTaskRecord
方法(从表单元素中收集详细信息)
func makeTaskRecord() -> TaskRecord? {
guard let current_task = task
else {
print("TaskForm.makeTaskRecord(): Can't create a record without a Task")
return nil
}
// check data validity
var errors:[String] = []
// generate StepRecords >>>
if stepsSelected.count == 0 {
errors.append("Error, no step selected")
}
// <<<
// DATA OK
if errors.isEmpty {
let taskrecord = TaskRecord(
id: record?.id,
taskId: task!.id,
userCode: Config.getUser()!.code, // global object containing login state
pictures: [],
memo: memo.text,
task: current_task,
stepRecords: stepsSelected // data here is correctly set
)
return taskrecord // but here, I can't retreive the stepRecords! (1)
}
else {
// display errors in an alert box
let errorVC = MyHelpers.makeAlert("Error with data", errors.joined(separator: "\n"))
self.present(errorVC, animated: true)
return nil
}
}
这是prepareData()方法的样子:( Record类的方法)
func prepareData() -> [String: Any]? {
// no steps in record, data is invalid
guard
let stepRecordsJson = try? JSONEncoder().encode(self.stepRecords)
// This is where I constated that stepRecords is different (set but empty)
else {
return nil
}
// other data
var params = [
"task_id": taskId,
"user_code": userCode,
"step_records": stepRecordsJson, // this is what doesn't work well, but it's certainly related to (1) above
"memo": memo ?? ""
] as [String : Any]
// when editing, we set again the record ID
if let edit_id = self.id {
params["id"] = edit_id
}
return params
}
注意:所有数据结构和Codable
struct
在上面的例子中,在(1)处,我在返回线上放了一个断点 检查数据时,我发现“子结构”没有好的值:
(lldb) print current_task.name
(String) $R0 = "屋根工事"
(lldb) print taskrecord.task.name
error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=1, address=0x6f).
The process has been returned to the state before expression evaluation.
task
是一个结构,所以不应该有问题,但调试器无法读取我分配给我的taskrecord的任务。
我有什么遗失的吗?就像某种指针引用一样?