[Error] object has been deleted or invalidated.

2023. 11. 1. 20:54ยท๐ŸŽ Dev/Issue

 

 

โš™๏ธ ํ™˜๊ฒฝ

- iOS 16์ด์ƒ
- Swift 5.9
- Xcode 15
 

๐Ÿ’ป ๋ฌธ์ œ์ƒํ™ฉ 

- ๊ฐœ์ธ์•ฑ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์ค‘ diffableDatasource๋กœ ์ปฌ๋ ‰์…˜๋ทฐ ํ™œ์šฉํ•˜๋Š” UI๋ฅผ ์‚ฌ์šฉ ์ค‘์ด์—ˆ๊ณ , Realm์—์„œ create๋Š” ์ž˜ ๋˜๋Š”๋ฐ delete๋ฅผ ํ•˜๋ ค๊ณ  ํ•˜๋ฉด delete ํŒ์—…์ฐฝ์—์„œ ์•ฑ์ด ํ„ฐ์ง€๋ฉฐ 'object has been deleted or invalidate'๋ผ๋Š” ์˜ค๋ฅ˜๊ฐ€ CollectionView๊ฐ€ ์žˆ๋Š” VC์˜ snapshot์„ ์ฐ๋Š” ๋ถ€๋ถ„์—์„œ ๋‚ฌ๋‹ค.
- '์ด๋ฏธ ์‚ญ์ œ๋œ ๊ฐœ์ฒด์ธ๋ฐ ์™œ ์ ‘๊ทผํ•ด?' ์˜๋ฏธ์˜ ์˜ค๋ฅ˜์˜€๋Š”๋ฐ, ๊ฐ์ฒด๊ฐ€ ํ•œ ๊ฐœ์ผ ๋• ๋ฌธ์ œ์—†์ด ๊ตฌํ˜„์ด ๋˜์—ˆ์œผ๋‚˜ ๋‘ ๊ฐœ ์ด์ƒ๋ถ€ํ„ฐ๋Š” ์‚ญ์ œ ์‹œ ์œ„์™€ ๊ฐ™์€ ์˜ค๋ฅ˜ ๋œจ๋ฉฐ ์•ฑ์ด ๋ฉˆ์ท„๋‹ค. 
 

โœ๏ธํ•ด๊ฒฐ๋ฐฉ์•ˆ

- ์ฒ˜์Œ์—” realm๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ์ธ ์ค„ ์•Œ๊ณ  realm์„ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ํ™•์ธํ•ด๋ณด์•˜์œผ๋‚˜, (1) ์‚ญ์ œํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋ฉฐ ์•ฑ์ด ๋ฉˆ์ถค์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ ˜์—์„œ๋Š” ์‚ญ์ œ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•œ ์…€ ๋ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ๋˜๊ณ  ์žˆ์—ˆ๊ณ  (2) print๋ฅผ ์ฐ์–ด์„œ ํ™•์ธํ–ˆ์„ ๋•Œ๋„ ๋ฉ”์„œ๋“œ์— ๋ฌธ์ œ ์—†์Œ์„ ํ™•์ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด ์˜ˆ์ƒ๊ณผ ๋‹ฌ๋ฆฌ realm์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ์—ˆ๋‹ค.
 
- ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•˜์ž๋ฉด diffableDatasource๋ถ€๋ถ„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ์ฐํžˆ๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— diffableDatasource ์ค‘ ์—…๋ฐ์ดํŠธ(apply)๋ฅผ ํ•ด์ฃผ๋Š” ๋ถ€๋ถ„์˜ ๋ฌธ์ œ์˜€๋‹ค. diffableDatasource๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ reloadData์˜ ์—ญํ• ์„ snapshot์ด ๋Œ€์‹ ํ•˜๋Š”๋ฐ apply์˜ ์ข…๋ฅ˜ ๋ฌธ์ œ์˜€๋‹ค๋Š” ๊ฑธ ํ•ด๋‹น ๋ฌธ์ œ๋กœ ์ผ์ฃผ์ผ๋™์•ˆ ์•“๋‹ค๊ฐ€ ๋ฉ˜ํ† ๋‹˜์˜ ํ•ด๊ฒฐ๋ฐฉ์•ˆ์„ ๋ณด๋ฉฐ ๋ฐฐ์šฐ๊ฒŒ ๋˜์—ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ์ฐํžˆ๋Š” ๋ถ€๋ถ„๋„ ๋”ฑ ์…€์˜ ๊ฐœ์ˆ˜๋ฅผ ์‚ญ์ œ ์ดํ›„์˜ ๊ฐœ์ˆ˜๋กœ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ๋Š” ๋ฉ”์„œ๋“œ๋กœ ์ด์–ด์งˆ ๋•Œ ์•ฑ์ด ํ„ฐ์กŒ๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ํžˆ apply์˜ ์‚ฌ์šฉ์ด ๋ฌธ์ œ๊ฐ€ ๋งž์•˜๋‹ค.
 
- ๋‚ด๊ฐ€ diffableDatasource๋ฅผ ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ๋Š” diffableDatasource์˜ animation ํšจ๊ณผ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๋ฅผ ์“ฐ๋Š” apply (animationDifferences: True)๋ฅผ ์‚ฌ์šฉํ•œ ์Šค๋ƒ…์ƒท์€ ์ƒˆ๋กœ ์—…๋ฐ์ดํŠธ ๋˜๊ธฐ ์ „ ์…€ ์œ„์น˜๋ฅผ ๊ธฐ์–ตํ•˜๊ณ , ๊ทธ ์œ„์น˜์—์„œ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด์ค€๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•ด๋ฒ„๋ฆฌ๋ฉด ์Šค๋ƒ…์ƒท์—๋Š” ์—ฌ์ „ํžˆ ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ ์‹ค์ œ๋กœ๋Š” ์‚ญ์ œ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— 'object has been deleted or invalidate'๋ผ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋œจ๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ. ๋ง๊ทธ๋Œ€๋กœ ์‚ญ์ œ๋œ ๊ฐ์ฒด์— ์Šค๋ƒ…์ƒท์€ ๊ทธ ๊ฐ์ฒด๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ๋ ค๊ณ  ์ ‘๊ทผํ•˜๊ณ  ์žˆ๊ธฐ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋˜ ๊ฑฐ๋‹ค.
 
- ์ˆ˜์ •ํ•œ ์ฝ”๋“œ:

 
- apply์˜ ์ข…๋ฅ˜ ์ค‘ applySnapshotUsingReloadData ๋ผ๋Š” ๊ฒŒ ์žˆ์—ˆ๋‹ค. apply(snapshot) ๋ถ€๋ถ„์„ applySnapshotUsingReloadData(snapshot)์œผ๋กœ ์ˆ˜์ •ํ•˜์ž, ์ ‘๊ทผ ๊ด€๋ จ ์˜ค๋ฅ˜๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค!
 
- applySnapshotUsingReloadData์— ๋Œ€ํ•˜์—ฌ ๊ณต์‹๋ฌธ์„œ๋ฅผ ํ™•์ธํ•ด๋ณด์•˜๋‹ค. ๋ฌธ์„œ์—๋Š” Resets the UI to reflect the state of the data in the snapshot without computing a diff or animating the changes. ๋ผ๊ณ  ์ •์˜๋ฅผ ํ•ด์ฃผ๊ณ  ์žˆ๋Š”๋ฐ, applySnapshotUsingReloadData ๋ฉ”์„œ๋“œ๋Š” current state๊ณผ new state์˜ ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐํ•˜๊ฑฐ๋‚˜ animating ๋ณ€ํ™”์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ณ  ์Šค๋ƒ…์ƒท์˜ ๋ฐ์ดํ„ฐ ์ƒํƒœ๋ฅผ UI์— ๋ฐ˜์˜ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์Šค๋ƒ…์ƒท์€ ์ด์ „์— ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์—ˆ๋˜ ๊ฐ์ฒด์— ๊ณ„์‚ฐ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ ‘๊ทผํ•˜๋ คํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜์˜ํ•ด์ค„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๊ฒƒ.
 
 
 

๐ŸงนDiffableDatasource + Snapshot + apply  ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌ

* ๋ชจ๋‘ ์• ํ”Œ ๊ณต์‹ ๋ฌธ์„œ ๋‚ด์šฉ ๊ธฐ๋ฐ˜์œผ๋กœ ์ •๋ฆฌํ•จ.
 
* DiffableDatasource: The object you use to manage data and provide cells for a collection view.

  • DiffableDatasource๋Š” ์ปฌ๋ ‰์…˜๋ทฐ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ๊ด€๋ จ UI๋ฅผ ๋ณ€ํ™”๋ฅผ ์Šค์Šค๋กœ ์ถ”์ ํ•ด์„œ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.
  • Hashable Value๋กœ ๋ฐ์ดํ„ฐ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ณ€ํ™”๋ฅผ ์ถ”์ ํ•œ๋‹ค. (CollectionView๋‚˜ TableView๋ฅผ ๊ทธ๋ฆด ๋•Œ ๋ˆ„๊ตฌ๋‚˜ ํ•œ๋ฒˆ์ฏค์€ out of index ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋‚˜๋ดค์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ผ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Œ! )

 

 
* Snapshot: a representation of the current state of the data in the colleciton view

  • Snapshot์€ ์ปฌ๋ ‰์…˜๋ทฐ๋ฅผ ๊ทธ๋ฆฌ๋Š” UI๊ฐ€ Truth์ธ ๋ฐ์ดํ„ฐ์˜ ํ˜„์žฌ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. Truthํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฑด ๊ทธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋”์ด์ƒ ์œ ํšจํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, ๋น„์–ด์žˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.

* apply

  • apply ์ฝ”๋“œ๊ฐ€ ๋‘ ๊ฐœ๊ฐ€ ์žˆ๋Š”๋ฐ, ํ•˜๋‚˜๋Š” iOS 13์— ๋“ฑ์žฅ ๋ฉ”์„œ๋“œ, ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” iOS 15์— ๋“ฑ์žฅํ•œ ๋ฉ”์„œ๋“œ์ด๋‹ค.
  • reloadData์™€ ๊ฐ™์€ ์—ญํ• ์€ ํ•˜๋Š”๋ฐ, iOS13์— ๋“ฑ์žฅํ•œ apply๋Š” animatingDiffrence๊ฐ€ true์ผ ๋•Œ๋งŒ diff ์—…๋ฐ์ดํŠธ, false ์ผ ๋•Œ๋ฉด reloadData ์ˆ˜ํ–‰ ||| iOS15์— ๋“ฑ์žฅํ•œ apply๋Š” animatingDiffrence์— ์ƒ๊ด€์—†์ด ํ•ญ์ƒ diff๋งŒ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด์ค€๋‹ค....์ธ๋ฐ ๋„ˆ๋ฌด ์–ด๋ ต๋‹ค.๊ทธ๋Ÿฐ๋ฐ animation์„ค์ •์„ ์ƒ๊ฐํ•˜๋ฉด iOS15์— ๋“ฑ์žฅํ•œ apply๋ฅผ ์“ฐ๋Š”๊ฒŒ ์ข‹์ง€ ์•Š๋‚˜.

* applySnapshotUsingReloadData

  • current state๊ณผ new state์˜ ์ฐจ์ด(diff)๋ฅผ ๊ณ„์‚ฐํ•˜๊ฑฐ๋‚˜ animating ๋ณ€ํ™”์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ณ  ์Šค๋ƒ…์ƒท์˜ ๋ฐ์ดํ„ฐ ์ƒํƒœ๋ฅผ UI์— ๋ฐ˜์˜ํ•ด์ฃผ๋Š” ๋ฉ”์„œ๋“œ. ์กฐ๊ธˆ ๋” reload์— ์ดˆ์ ์„ ๋งž์ถ˜ ๊ฒƒ ๊ฐ™๋‹ค.

 
 
 

 
 
 
 
 
 

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐ŸŽ Dev > Issue' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Error] Library not loaded: @rpath no such file  (0) 2023.11.13
[Error] Could not get GOOGLE_APP_ID in Google Services file from build environme  (0) 2023.11.10
[Issue] Assets์„ ์‹ค์ˆ˜๋กœ ์‚ญ์ œํ–ˆ๋‹ค๋ฉด?  (0) 2023.08.22
[Error] Could not insert new outlet connection  (2) 2023.08.16
[Issue/UIKit] TableViewCell์— ์ถ”๊ฐ€ํ•œ ๋ฒ„ํŠผ ๊ตฌ๋ณ„ํ•˜๊ธฐ  (0) 2023.08.06
'๐ŸŽ Dev/Issue' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Error] Library not loaded: @rpath no such file
  • [Error] Could not get GOOGLE_APP_ID in Google Services file from build environme
  • [Issue] Assets์„ ์‹ค์ˆ˜๋กœ ์‚ญ์ œํ–ˆ๋‹ค๋ฉด?
  • [Error] Could not insert new outlet connection
Callie_
Callie_
  • Callie_
    CalliOS
    Callie_
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ
      • ๐ŸŽ APPLE
      • ๐ŸŽ Dev
        • Swift
        • UIKit
        • SwiftUI
        • Issue
        • ๊ตฌํ˜„
      • ๐ŸŽ Design
        • HIG
      • โš™๏ธ CS
      • ๐Ÿ’ก ์•Œ๊ณ ๋ฆฌ์ฆ˜
        • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
        • ๋ฐฑ์ค€
      • ๐ŸŸ๏ธ ์ง๊ด€๋กœ๊ทธ (์ถœ์‹œ์•ฑ)
        • ์—…๋ฐ์ดํŠธ
      • ๐ŸŒฑ SeSAC iOS 3๊ธฐ
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    .fullScreen
    apply
    SwiftUI
    DiffableDataSource
    CocoaTouchFramework
    SeSAC
    DidEndOnExit
    ํ™”๋ฉด์ „ํ™˜
    Enum
    layer.shadow
    cornerradius
    IBOutlet
    addTarget
    CustomView
    assets
    clipsToBound
    .OverFullScreen
    ๋„คํŠธ์›Œํฌํ†ต์‹ 
    IBAction
    modalPresentStyle
    stroyboard
    Infoํƒญ
    Swift
    Snapshot
    ios
    Entry Point
    ์ƒ๋ช…์ฃผ๊ธฐ
    TableViewCell
    diffable
    TapGestureRecognizer
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Callie_
[Error] object has been deleted or invalidated.
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”