【Swift/Realm】「Object has been deleted or invalidated.」エラーの原因と解決方法
この記事からわかること
- Realm Swiftで発生したエラーの解決方法
- Object has been deleted or invalidated.の原因とは?
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Object has been deleted or invalidated.とは?
Realmを使用してiOSアプリ開発時に「Object has been deleted or invalidated.」というエラーが以下のようなアプリコード条件で発生しました。
発生したエラー
Object has been deleted or invalidated.
発生環境
- Realmで取得したデータを配列に変換しアプリ内で流用
- 配列で保持するデータをList表示
- Listから削除された際にRealmのデータも削除
- 配列内の要素の最後の一個を削除しようとすると発生
public func readAllBooks() -> [Book] {
let books = realm.objects(Book.self)
return Array(books)
}
※@ObservedResults
などを使えばそもそも配列などに入れ替える必要はないですが今回はあえて配列でいきたかったのです。
発生原因
翻訳
オブジェクトは削除または無効化されました。
調べてみるとこのエラーは存在しなくなったはずのオブジェクトに参照しようとすることで発生するようです。
解決方法
解決方法は取得したRealmResultsオブジェクトをfreeze
メソッドを使用して凍結させることでした。
public func readAllBooks() -> [Book] {
let books = realm.objects(Book.self).freeze()
return Array(books)
}
@ObservedResults
で取得したインスタンスも凍結されているのでアプリ内で操作する際はfreeze
メソッドを使用して凍結させると良さそうです。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。