You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Realm删除笔记时App偶发崩溃问题求助

笔记删除时应用崩溃问题排查求助

删除App中的笔记时偶尔会出现崩溃情况,比如添加3条笔记后删除第一条就会崩溃,但有时添加多条笔记后删除却无异常。以下是相关代码及报错信息,请求帮忙排查问题。

ViewModel删除方法代码

func deleteNote(atIndex index: Int) {

  guard notes.indices.contains(index) else { return }

  do {
    let realm = try Realm()
    try realm.write {
      // 优化方案:从查询结果获取对象引用,避免失效
      if let objectToDelete = realm.objects(Note.self).filter("id == %@", notes[index].id).first {
        realm.delete(objectToDelete)
        // Realm中删除成功后,从内存列表移除
        notes.remove(at: index)
      } else {
        print("Note not found in Realm for deletion (index: \(index))")
      }
    }
  } catch {
    print("Error deleting note: \(error.localizedDescription)")
  }
}

滑动删除触发代码

.onDelete(perform: { indexSet in
  guard let index = indexSet.first else { return }
  viewModel.deleteNote(atIndex: index)
})

报错信息

**Error:** Exception    NSException *   "Object has been deleted or invalidated."   0x0000600000ca6ac0
name    __NSCFConstantString *  "RLMException"  0x0000000105ad44e0
reason  __NSCFString *  "Object has been deleted or invalidated."   0x00006000017a3280
userInfo    __NSDictionaryM *   2 key/value pairs   0x000060000054fd00
reserved    __NSDictionaryM *   2 key/value pairs   0x000060000054fcc0

我猜测错误出在realm.delete(objectToDelete)这一行。

获取笔记代码

func getNotes() {
    let realm = try! Realm() // 获取Realm实例
    
    notes = Array(realm.objects(Note.self)) // 从Realm获取所有笔记
}

列表渲染代码

List {
    ForEach(viewModel.notes) { note in
        HStack {
            Toggle(isOn: Binding(
                get: { note.isCompleted },
                set: { newValue in
                    viewModel.markNoteAsCompleted(id: note.id)
                }
            ), label: {
                Text(note.title)
                    .strikethrough(note.isCompleted)
                    .foregroundStyle(note.isCompleted ? Color("grey") : Color("white"))
            })
            .toggleStyle(iOSCheckboxToggleStyle())
        }
        .padding(10)
        .listRowBackground(Color("backgroundLightSecond"))
    }
    .onDelete(perform: { indexSet in
      guard let index = indexSet.first else { return }
      viewModel.deleteNote(atIndex: index)
    })
    .listRowSeparator(.hidden)
}
.listRowSpacing(10)
.clipShape(.rect(cornerRadius: 15))
.scrollContentBackground(.hidden)

内容的提问来源于stack exchange,提问作者Max Elmers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 01:51:20