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

Realm删除对象时抛出‘Object已删除或无效’RLMException异常求助

解决Realm删除对象时的“Object has been deleted or invalidated”异常

问题根源

核心问题是Realm对象的线程绑定特性:Realm对象只能在创建它的线程中访问,跨线程的对象引用无法准确反映当前有效性状态。你之前的代码里,character对象大概率是在非主线程获取的,即便在主线程异步执行检查和删除,这个跨线程引用的isInvalidated值已经过时,甚至可能在检查与删除操作的间隙,对象被其他线程删除,最终触发异常。另外,try?会吞掉错误信息,导致你无法定位具体失败原因。

解决方案

1. 在操作线程重新获取对象(推荐)

不要复用跨线程的对象引用,而是在主线程通过主键重新查询对象,确保操作的是当前线程有效的Realm实例和对象:

if let characterID = character?.id { // 先拿到对象的主键值(假设主键为id)
    DispatchQueue.main.async {
        do {
            let realm = try Realm()
            if let validCharacter = realm.object(ofType: MyCharacterObjectModel.self, forPrimaryKey: characterID) {
                try realm.write {
                    realm.delete(validCharacter)
                }
            } else {
                print("对象已被删除或不存在")
            }
            self.leaveThisPage()
        } catch {
            print("Realm操作失败:\(error)")
        }
    }
}

2. 确保Realm实例与对象同线程

如果character本身是在主线程创建的,要确保操作时使用的是主线程的Realm实例,并且在写入前重新确认对象状态:

if let character = character {
    DispatchQueue.main.async {
        do {
            let realm = try Realm()
            // 在当前线程的Realm中重新获取对象
            if let validCharacter = realm.object(ofType: MyCharacterObjectModel.self, forPrimaryKey: character.id) {
                try realm.write {
                    realm.delete(validCharacter)
                }
            }
            self.leaveThisPage()
        } catch {
            print("删除失败:\(error)")
        }
    }
}

3. 不要吞掉错误信息

把try?换成do-catch,捕获并打印具体异常,方便排查问题:

do {
    try realm.write {
        realm.delete(validCharacter)
    }
} catch let error as NSError {
    print("删除操作异常:\(error.localizedDescription)")
}

关键注意事项

  • Realm对象和Realm实例都是线程绑定的,绝对不要跨线程传递Realm对象引用,只能传递主键等标识性数据,在目标线程重新查询。
  • 即便在同一线程,对象的isInvalidated状态可能在检查与操作之间被其他逻辑修改,所以写入前重新查询对象是最稳妥的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 19:52:14