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
相关产品推荐
相关产品推荐

