iOS/🍎 Documentation

[iOS] NSCoding μ΄λž€? (feat. 인코딩, λ””μ½”λ”©, 아카이빙)

woozzang 2021. 5. 23. 20:48

μ•ˆλ…•ν•˜μ„Έμš”. μ˜€λŠ˜μ€ κ³΅μ‹λ¬Έμ„œμ—μ„œ μ„€λͺ…ν•˜λŠ” NSCoding λ₯Ό κ³΅λΆ€ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€πŸΆ


 

NSCoding

protocol NSCoding

NSCoding은 ν΄λž˜μŠ€κ°€ encoding κ³Ό decoding λ˜λŠ” 것을 κ°€λŠ₯ν•˜κ²Œ ν•΄μ£ΌλŠ” ν”„λ‘œν† μ½œμž…λ‹ˆλ‹€.

 

λ‹€μ‹œ λ§ν•˜λ©΄, NSCoding 을 μ±„νƒν•œ ν΄λž˜μŠ€λŠ” encoding κ³Ό decoding 이 κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€.

 

https://velog.io/@chan33344/Codable-인코딩-λ””μ½”λ”©μ΄λž€

 

인코딩은 기쑴의 ν˜•μ‹μ„ λ‹€λ₯Έ ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 것을 κ°€λ¦¬ν‚΅λ‹ˆλ‹€.

 

예λ₯Ό λ“€μ–΄ Swift 의 Struct μΈμŠ€ν„΄μŠ€λ₯Ό JSON ν˜•νƒœμ˜ λ¬Έμžμ—΄λ‘œ λ³€ν™˜μ‹œν‚€λŠ” 것은 JSON Encoding 이라고 λΆ€λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

디코딩은 κ·Έ λ°˜λŒ€μž…λ‹ˆλ‹€.

 

그리고 Encoding κ³Ό Decoding 은 아카이빙(Archiving) κ³Ό  λ””μŠ€νŠΈλ¦¬λ·°μ…˜(Distribution) 에 ν•„μš”ν•©λ‹ˆλ‹€.

 

κ°œμš”

ν”„λ‘œν† μ½œμ€ μš”κ΅¬μ‚¬ν•­μ΄λ―€λ‘œ, NSCoding ν”„λ‘œν† μ½œμ€ 이 ν”„λ‘œν† μ½œμ„ μ±„νƒν•œ ν΄λž˜μŠ€κ°€ 두 κ°€μ§€ 멀버λ₯Ό κ΅¬ν˜„ν•  것을 μš”κ΅¬ν•©λ‹ˆλ‹€.

 

NSCoding 을 μ±„νƒν•œ UIViewControllerμ—μ„œ init?(coder:) λ₯Ό 이미 μ‚΄νŽ΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€πŸ˜Ž

 

Encoding κ³Ό Decoding 은 아카이빙(Archiving) κ³Ό  λ””μŠ€νŠΈλ¦¬λ·°μ…˜(Distribution)의 κΈ°λ³Έ μ‘°κ±΄μž…λ‹ˆλ‹€.

 

μ—¬κΈ°μ„œ 아카이빙(Archiving)은 μ˜€λΈŒμ νŠΈλ‚˜ μ–΄λ–€ ꡬ쑰의 데이터가 λ””μŠ€ν¬μ— μ €μž₯λ˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

 


πŸ’‘ μ’€ 더 μžμ„Ένžˆ, Archivesλž€?

μ˜€λΈŒμ νŠΈμ™€ 값을 μ•„ν‚€ν…μ²˜μ— μ’…μ†λ˜μ§€ μ•ŠλŠ” λ°”μ΄νŠΈμ˜ μ—΄λ“€( stream of bytes) 둜 λ³€ν™˜ν•  수 μžˆλŠ” μˆ˜λ‹¨μ„ μ œκ³΅ν•©λ‹ˆλ‹€.

 

그리고 아카이빙을 ν•˜λŠ” μ£Όμ²΄λŠ” 아카이버(Archiver) μž…λ‹ˆλ‹€. NSKeyedArchiver  λ“±μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

 

이 λ•Œ 이 λ°”μ΄νŠΈ 열은 μ˜€λΈŒμ νŠΈμ™€ κ°’λ“€ μ‚¬μ΄μ˜ 관계와 identiy λŠ” μœ μ§€ν•œ μƒνƒœλ‘œ λ³€ν™˜λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

 

Cocoa archives can hold Objective-C objects, scalars, arrays, structures, and strings

좜처 :  Archives and Serializations Programming Guide


 

그리고 λ””μŠ€νŠΈλ¦¬λ·°μ…˜(Distribution)은 μ˜€λΈŒμ νŠΈκ°€ μ •μ˜ 된 κ³³ λ°–μ˜ λ‹€λ₯Έ μ£Όμ†Œ 곡간에 λ³΅μ‚¬λ˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

μ•„μΉ΄μ΄λΉ™λœ λ°”μ΄λ„ˆλ¦¬ 데이터λ₯Ό λΆˆλŸ¬μ™€μ„œ λ‹€λ₯Έ κ³³μ—μ„œ λ””μ½”λ”©ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆμœΌλ‹ˆ 이런 의미둜 μ“΄ κ²ƒμœΌλ‘œ μ΄ν•΄ν–ˆλ‹€.

 

NSCoding ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜κ²Œ 되면 NSCoder νƒ€μž…μ˜ coder κ°€ μ˜€λΈŒμ νŠΈμ˜ λ©”μ„œλ“œ encode(with:) 와 init(coder:) λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.

 

encode(with:) λŠ” μ˜€λΈŒμ νŠΈκ°€ μžμ‹ μ—κ²Œ μ œκ³΅λ°›μ€ coder λ₯Ό 톡해 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μΈμ½”λ”©ν•˜λ„λ‘ μ§€μ‹œν•©λ‹ˆλ‹€.

 

그리고 μ˜€λΈŒμ νŠΈλŠ” 이 λ©”μ„œλ“œλ₯Ό μˆ˜μ°¨λ‘€ 전달받을 수 μžˆμŠ΅λ‹ˆλ‹€.

❗️"AλΌλŠ” μ˜€λΈŒμ νŠΈμ—κ²Œ λ©”μ‹œμ§€λ₯Ό μ „λ‹¬ν•œλ‹€" = "A의 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œλ‹€" μ΄λ―€λ‘œ, μœ„ λ¬Έμž₯은 encode(with:) λ©”μ„œλ“œκ°€ μ—¬λŸ¬λ²ˆ ν˜ΈμΆœλœλ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

 

init(coder:) λŠ” 전달받은 coder 에 λ“€μ–΄μžˆλŠ” data (λ°”μ΄λ„ˆλ¦¬ 데이터) λ₯Ό μ΄μš©ν•˜μ—¬ ν•΄λ‹Ή 였브젝트 ν˜•μ‹μœΌλ‘œ μ΄ˆκΈ°ν™”ν•˜λ„λ‘ μ§€μ‹œν•©λ‹ˆλ‹€.

 

그것은 λ‹€λ₯Έ μƒμ„±μžλ₯Ό λŒ€μ²΄ν•˜κ³ , ν•˜λ‚˜μ˜ μ˜€λΈŒμ νŠΈλ‹Ή ν•œλ²ˆλ§Œ λ³΄λ‚΄μ§‘λ‹ˆλ‹€.

 

 μ–΄λ–€ 였브젝트 ν΄λž˜μŠ€κ°€ codeable ( encoding κ³Ό decoding이 κ°€λŠ₯ν•œ) ν•˜λ €λ©΄ λ°˜λ“œμ‹œ NSCoding ν”„λ‘œν† μ½œλ₯Ό μ±„νƒν•˜μ—¬ κ·Έ μš”κ΅¬μ‚¬ν•­μ„ κ΅¬ν˜„ν•΄μ•Όν•©λ‹ˆλ‹€. (μ—¬κΈ°μ„œ Codable ν”„λ‘œν† μ½œμ€ 아직 μƒκ°ν•˜μ§€ μ•ŠλŠ” κ²ƒμœΌλ‘œ ^^)

 

macOS 10.2 이후 λΆ€ν„°λŠ” KeyedArchiving 을 주둜 μ‚¬μš©ν•œλ‹€κ³  ν•©λ‹ˆλ‹€.

 

Keyed archives λŠ” NSKeyedArchiver 와 NSKeyedUnarchiver λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒμ„±λ©λ‹ˆλ‹€.


 

정리

객체λ₯Ό 아카이빙 ν•˜κ³  μ‹Άλ‹€λ©΄ (파일둜 μ €μž₯ν•˜κ³  μ‹Άλ‹€λ©΄) NSObjcet λ₯Ό μƒμ†ν•˜κ³ , NSCoding ν”„λ‘œν† μ½œμ„ κ΅¬ν˜„ν•˜λ©΄ λ©λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ κ΅¬μ‘°μ²΄λŠ” 아카이빙 ν•  수 μ—†μŠ΅λ‹ˆλ‹€. ꡬ쑰체의 경우 Encodable κ³Ό Decodable ν”„λ‘œν† μ½œμ„ μ΄μš©ν•©λ‹ˆλ‹€.

 

 


 

아직 이해가 ν•„μš”ν•œ λΆ€λΆ„ πŸ€”

archivedData(withRootObject:requiringSecureCoding:)

NSKeyedArchiver 의 νƒ€μž… λ©”μ„œλ“œμΈλ°, 'root of the object graph to archive' λΌλŠ” ν‘œν˜„μ΄ 이해가 κ°€μ§€ μ•ŠλŠ”λ‹€.

 

아카이빙 λŒ€μƒμ˜ ν΄λž˜μŠ€κ°€ μ–΄λ–€ 클래슀의 μ„œλΈŒ 클래슀이면, κ·Έ 클래슀 κ³„μΈ΅μ˜ 루트 클래슀λ₯Ό μ „λ‹¬ν•˜λΌλŠ” 의미 인건가?

 

 

 

끝!


πŸ€–πŸŸ’[우짱의 iOS λΈ”λ‘œκ·Έ]πŸ”΅πŸ’»

iOSλ₯Ό κ³΅λΆ€ν•˜λ©΄μ„œ 배운 λ‚΄μš©μ„ κΈ°λ‘ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

 

참고 자료 1: https://developer.apple.com/documentation/foundation/nscoding