Skip to content

Latest commit

Β 

History

History
174 lines (109 loc) Β· 12.2 KB

Automatic-Reference-Counting.md

File metadata and controls

174 lines (109 loc) Β· 12.2 KB

Automatic Reference Counting

Automatic Reference Counting - The Swift Programming Language (Swift 5.1)

SwiftλŠ” μ•±μ˜ λ©”λͺ¨λ¦¬ μ‚¬μš©μ„ μΆ”μ ν•˜κ³  관리 ν•˜κΈ° μœ„ν•΄ Automatic Reference Counting (ARC)λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. λŒ€λΆ€λΆ„μ˜ 경우, 이것은 Swiftμ—μ„œ λ©”λͺ¨λ¦¬ 관리λ₯Ό "κ·Έλƒ₯ μž‘λ™λœλ‹€"λŠ” 것을 μ˜λ―Έν•˜κ³ , 당신이 λ©”λͺ¨λ¦¬ 관리에 λŒ€ν•΄μ„œ 생각 ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. 클래슀 μΈμŠ€ν„΄μŠ€μ— μ˜ν•΄ μ‚¬μš© λ˜λŠ” λ©”λͺ¨λ¦¬κ°€ 더이상 ν•„μš” ν•˜μ§€ μ•Šμ„ λ•Œ ARCλŠ” λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œν•©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ, λͺ‡λͺ‡ μΌ€μ΄μŠ€μ—μ„œ ARCλŠ” λ©”λͺ¨λ¦¬λ₯Ό 관리 ν•˜κΈ° μœ„ν•΄ λ‹Ήμ‹ μ˜ μ½”λ“œμ˜ λΆ€λΆ„ κ°„μ˜ 관계에 λŒ€ν•œ 더 λ§Žμ€ 정보λ₯Ό μš”κ΅¬ν•©λ‹ˆλ‹€. 이번 μ±•ν„°μ—μ„œλŠ” κ·ΈλŸ¬ν•œ 상황듀에 λŒ€ν•΄ μ„€λͺ…ν•˜κ³  ARCκ°€ λ‹Ήμ‹ μ˜ μ•±μ˜ λͺ¨λ“  λ©”λͺ¨λ¦¬λ₯Ό 관리할 수 μžˆλ„λ‘ ν•˜λŠ”μ§€ 보여쀄 κ²λ‹ˆλ‹€. Swiftμ—μ„œ ARCλ₯Ό μ‚¬μš©ν•˜λŠ” 것은 Obective-C둜 ARCλ₯Ό μ‚¬μš©ν•˜λŠ” Transitioning to ARC Release Notesμ—μ„œμ˜ μ„€λͺ…κ³Ό 맀우 μœ μ‚¬ν•©λ‹ˆλ‹€.

Reference counting은 클래슀의 μΈμŠ€ν„΄μŠ€μ—μ„œλ§Œ 적용 κ°€λŠ₯ν•©λ‹ˆλ‹€. κ΅¬μ‘°μ²΄λ‚˜ μ—΄κ±°ν˜•μ€ μ°Έμ‘° νƒ€μž…μ΄ μ•„λ‹Œ, κ°’ νƒ€μž…μ΄κ³  λ ˆνΌλŸ°μŠ€μ— μ˜ν•΄ μ €μž₯되고 전달 λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

ARC의 λ™μž‘ 방식(How ARC Works)

클래슀의 μƒˆ μΈμŠ€ν„΄μŠ€λ₯Ό 생성 ν•  λ•Œ λ§ˆλ‹€, ARCλŠ” μΈμŠ€ν„΄μŠ€μ— λŒ€ν•œ 정보λ₯Ό μ €μž₯ ν•˜κΈ° μœ„ν•΄ λ©”λͺ¨λ¦¬μ˜ 덩어리λ₯Ό ν• λ‹Ήν•©λ‹ˆλ‹€. 이 λ©”λͺ¨λ¦¬λŠ” μΈμŠ€ν„΄μŠ€μ˜ νƒ€μž…μ— λŒ€ν•œ 정보와 κ·Έ μΈμŠ€ν„΄μŠ€μ™€ κ΄€λ ¨λœ μ €μž₯ ν”„λ‘œνΌν‹°μ˜ 값도 가지고 μžˆμŠ΅λ‹ˆλ‹€.

μΆ”κ°€μ μœΌλ‘œ, μΈμŠ€ν„΄μŠ€κ°€ 더이상 ν•„μš” 없어지면, ARCλŠ” λ©”λͺ¨λ¦¬κ°€ λ‹€λ₯Έ λͺ©μ μœΌλ‘œ μ‚¬μš© λ˜μ–΄ 질 수 μžˆλ„λ‘ κ·Έ μΈμŠ€ν„΄μŠ€μ— μ˜ν•΄ μ‚¬μš© 된 λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œν•©λ‹ˆλ‹€. 이것은 클래슀 μΈμŠ€ν„΄μŠ€κ°€ 그듀이 더이상 ν•„μš” 없을 λ•Œ λ©”λͺ¨λ¦¬μ˜ 곡간을 차지 ν•˜κ³  μžˆμ§€ μ•Šλ‹€λŠ” 것을 보μž₯ν•©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ, ARCκ°€ μ—¬μ „νžˆ μ‚¬μš© 되고 μžˆλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό ν•΄μ œ ν–ˆλ‹€λ©΄, μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°μ— 더이상 μ ‘κ·Ό ν•  수 μ—†κ±°λ‚˜, μΈμŠ€ν„΄μŠ€μ˜ λ©”μ†Œλ“€λ₯Ό 호좜 ν•  수 μ—†μŠ΅λ‹ˆλ‹€. λ§Œμ•½ μΈμŠ€ν„΄μŠ€μ— μ ‘κ·Ό ν•˜λ € ν•œλ‹€λ©΄, 앱은 λŒ€λΆ€λΆ„ μ•„λ§ˆλ„ ν¬λž˜μ‹œκ°€ λ‚  것 μž…λ‹ˆλ‹€.

μΈμŠ€ν„΄μŠ€κ°€ μ‚¬μš© λ˜λŠ” λ™μ•ˆμ— 사라지지 μ•Šκ²Œ ν•˜κΈ° μœ„ν•΄μ„œλŠ”, ARCλŠ” μ–Όλ§ˆλ‚˜ λ§Žμ€ ν”„λ‘œνΌν‹°, μƒμˆ˜, 그리고 λ³€μˆ˜λ“€μ΄ ν˜„μž¬ 각각의 클래슀 μΈμŠ€ν„΄μŠ€μ— 참쑰되고 μžˆλŠ”μ§€ μΆ”μ ν•©λ‹ˆλ‹€. ARCλŠ” μ‘΄μž¬ν•˜λŠ” μΈμŠ€ν„΄μŠ€μ— 적어도 ν•˜λ‚˜μ˜ ν™œμ„±ν™”λœ λ ˆνΌλŸ°μŠ€κ°€ μžˆλ‹€λ©΄ μΈμŠ€ν„΄μŠ€λ₯΄ ν•΄μ œν•˜μ§€ μ•Šμ„ 것 μž…λ‹ˆλ‹€.

클래슀 μΈμŠ€ν„΄μŠ€λ₯Ό ν”„λ‘œνΌν‹°, μƒμˆ˜ ν˜Ήμ€ λ³€μˆ˜μ— ν• λ‹Ή ν•  λ•Œ μ–Έμ œλ“ μ§€, ν”„λ‘œνΌν‹°, μƒμˆ˜, λ³€μˆ˜λŠ” 이것을 κ°€λŠ₯ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄ μΈμŠ€ν„΄μŠ€μ— κ°•ν•œ μ°Έμ‘°λ₯Ό λ§Œλ“­λ‹ˆλ‹€. 이 μ°Έμ‘°λŠ” κ°•ν•œ 참쑰둜 λΆˆλ¦½λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ κ·Έ μΈμŠ€ν„΄μŠ€μ— λ‹¨λ‹¨ν•œ 고정을 μœ μ§€ν•˜κ³ , κ°•ν•œ μ°Έμ‘°κ°€ 남아 μžˆλŠ” ν•œ ν•΄μ œλ₯Ό ν—ˆμš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

ARC의 μ‚¬μš©(ARC in Action)

μ—¬κΈ° Auto Reference Counting의 λ™μž‘ 방식에 λŒ€ν•œ μ˜ˆμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 이 μ˜ˆμ œλŠ” nameμ΄λΌλŠ” μ €μž₯ μƒμˆ˜ ν”„λ‘œνΌν‹°λ₯Ό μ •μ˜ν•˜λŠ” Person μ΄λΌλŠ” κ°„λ‹¨ν•œ 클래슀둜 μ‹œμž‘ν•©λ‹ˆλ‹€.

    class Person {
    	let name: String
    
    	init(name: String) {
    		self.name = name
    		print("\(name)is being initialized")
    	}
    
    	deinit {
    		print("\(name)is being deinitialized")
    	}
    }

Person ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€μ˜ name ν”„λ‘œνΌν‹°λ₯Ό μ„ΈνŒ…ν•˜κ³  μ΄ˆκΈ°ν™”κ°€ 진행 μ€‘μž„μ„ λ‚˜νƒ€λ‚΄λŠ” λ©”μ‹œμ§€λ₯Ό 좜λ ₯ ν•΄μ£ΌλŠ” μƒμ„±μžλ₯Ό κ°–κ³  μžˆμŠ΅λ‹ˆλ‹€. Person ν΄λž˜μŠ€λŠ” 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ ν•΄μ œ 될 λ•Œ 메세지λ₯Ό 좜λ ₯ν•˜λŠ” μ†Œλ©Έμž λ˜ν•œ 가지고 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒ μ½”λ“œλŠ” Person μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄ μ‚¬μš© λ˜λŠ” λ‹€μˆ˜μ˜ μ°Έμ‘°λ₯Ό Person? νƒ€μž…μ˜ 3개의 λ³€μˆ˜λ₯Ό μ •μ˜ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 λ³€μˆ˜λ“€μ΄ μ˜΅μ…”λ„ νƒ€μž…μ΄κΈ° λ•Œλ¬Έμ—(Person이 μ•„λ‹Œ,Person?), μžλ™μœΌλ‘œ nil κ°’μœΌλ‘œ μ΄ˆκΈ°ν™” 되고, ν˜„μž¬λŠ” Person μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜κ³  μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

    var reference1: Person?
    var reference2: Person?
    var reference3: Person?

이제 μƒˆλ‘œμš΄ Person μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”ν•˜κ³  3개 λ³€μˆ˜λ“€ 쀑 ν•˜λ‚˜λ₯Ό ν• λ‹Ή ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    refernce1 = Person(name: "Jinha Park")
    // Prints "Jinha Park is being initialized"

Person클래슀의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λŠ” μ‹œμ μ— "Jinha Park is being initialized" λΌλŠ” 메세지가 좜λ ₯λ˜λŠ” 것을 μ£Όλͺ©ν•˜μ„Έμš”. 이것은 μ΄ˆκΈ°ν™”κ°€ μ΄λ£¨μ–΄μ‘Œλ‹€λŠ” 것을 확인해 μ€λ‹ˆλ‹€.

PersonμΈμŠ€ν„΄μŠ€κ°€ reference1 λ³€μˆ˜μ— 할당이 λ˜μ—ˆκΈ° λ•Œλ¬Έμ—, reference1μ—μ„œ PersonμΈμŠ€ν„΄μŠ€μ— κ°•ν•œ μ°Έμ‘°κ°€ 되고 μžˆμŠ΅λ‹ˆλ‹€. 적어도 ν•˜λ‚˜μ˜ κ°•ν•œ μ°Έμ‘°κ°€ 있기 λ•Œλ¬Έμ—, ARCλŠ” Person을 λ©”λͺ¨λ¦¬μ— μœ μ§€ μ‹œν‚€λ„λ‘ ν•  것이고 ν•΄μ œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

같은 PersonμΈμŠ€ν„΄μŠ€λ₯Ό 두 개의 λ³€μˆ˜μ— 더 ν• λ‹Ήν•˜λ©΄, μΈμŠ€ν„΄μŠ€μ— λ‘κ°œμ˜ κ°•ν•œ μ°Έμ‘°κ°€ μƒκΈ°κ²Œ λ©λ‹ˆλ‹€.

    refernce2 = refernce1
    refernce3 = refernce1

μ—¬κΈ°μ—” ν•˜λ‚˜μ˜ Person μΈμŠ€ν„΄μŠ€μ— μ„Έκ°œμ˜ κ°•ν•œ μ°Έμ‘°κ°€ μžˆμŠ΅λ‹ˆλ‹€.

λ§Œμ•½ 이 λ‘κ°œμ˜ κ°•ν•œ μ°Έμ‘°(κΈ°μ‘΄ μ°Έμ‘°λ₯Ό ν¬ν•¨ν•œ)λ₯Ό λ‘κ°œμ˜ λ³€μˆ˜μ— nil을 ν• λ‹ΉμœΌλ‘œμ„œ κΉ¨κ³  μ‹Άλ‹€λ©΄, ν•˜λ‚˜μ˜ κ°•ν•œ μ°Έμ‘°λŠ” λ‚¨μ•„μžˆκ³ , PersonμΈμŠ€ν„΄μŠ€λŠ” ν•΄μ œλ˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€.

    refernce1 = nil
    refernce2 = nil

ARCλŠ” μ„Έλ²ˆμ§Έ 그리고 λ§ˆμ§€λ§‰ κ°•ν•œ μ°Έμ‘°κ°€ 깨지기 μ „κΉŒμ§€, PersonμΈμŠ€ν„΄μŠ€λ₯Ό ν•΄μ œν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. Person μΈμŠ€ν„΄μŠ€λ₯Ό 더이상 μ‚¬μš© ν•˜μ§€ μ•ŠλŠ” μ‹œμ μ— ν•΄μ œ λ©λ‹ˆλ‹€.

    refernce3 = nil
    // Prints "Jinha Park is being deinitialized"

클래슀 μΈμŠ€ν„΄μŠ€ κ°„ κ°•ν•œ μˆœν™˜ μ°Έμ‘° (Strong Reference Cycles Between Class Instances)

μœ„μ˜ μ˜ˆμ œμ—μ„œ, ARCλŠ” μƒμ„±ν•œ μƒˆλ‘œμš΄ Person μΈμŠ€ν„΄μŠ€μ˜ 참쑰의 개수λ₯Ό 좔적 ν•  수 있고 Person μΈμŠ€ν„΄μŠ€κ°€ 더이상 ν•„μš” 없을 λ•Œ ν•΄μ œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ, 클래슀의 μΈμŠ€ν„΄μŠ€μ˜ κ°•ν•œ μ°Έμ‘°κ°€ 0 이 λ˜λŠ” μ‹œμ μ΄ μ „ν˜€ 생기지 μ•ŠλŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ²Œ 될 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 이것은 두 개의 클래슀 μΈμŠ€ν„΄μŠ€κ°€ μ„œλ‘œ κ°•ν•œ μ°Έμ‘°λ₯Ό ν•˜κ³ , 각각의 μΈμŠ€ν„΄μŠ€κ°€ λ‹€λ₯Έ μΈμŠ€ν„΄μŠ€λ₯Ό μ‚΄λ € λ‘˜ κ²½μš°μ— λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이것은 κ°•ν•œ μ°Έμ‘° μˆœν™˜μ΄λΌκ³  μ•Œλ €μ Έ μžˆμŠ΅λ‹ˆλ‹€.

클래슀 κ°„μ˜ 관계λ₯Ό strong μ°Έμ‘° λŒ€μ‹  weak λ˜λŠ” unowned 참쑰둜 μ •μ˜ ν•¨μœΌλ‘œμ¨ κ°•ν•œ μˆœν™˜ μ°Έμ‘°λ₯Ό ν•΄κ²° ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 과정은 클래슀 μΈμŠ€ν„΄μŠ€ κ°„μ˜ κ°•ν•œ μˆœν™˜ μ°Έμ‘° ν•΄κ²°ν•˜κΈ°(Resolving Strong Refernce Cycles Between Class Instances)μ—μ„œ μ„€λͺ…λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ, κ°•ν•œ μ°Έμ‘° μˆœν™˜μ˜ ν•΄κ²° 방법을 배우기 전에, κ°•ν•œ μˆœν™˜ μ°Έμ‘°κ°€ μ–΄λ–»κ²Œ λ°œμƒ ν•˜λŠ”μ§€μ— λŒ€ν•΄ μ΄ν•΄ν•˜λŠ” 것이 도움이 될 것 μž…λ‹ˆλ‹€.

μ—¬κΈ° κ°•ν•œ μˆœν™˜ μ°Έμ‘°κ°€ μ–΄λ–»κ²Œ μš°μ—°νžˆ μƒκΈ°λŠ” 지에 λŒ€ν•œ μ˜ˆμ‹œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 이 μ˜ˆμ‹œλŠ” μ•„νŒŒνŠΈμ˜ 단지와 거주자의 λͺ¨λΈν™”ν•œ Personκ³Ό ApartmentλΌλŠ” 클래슀λ₯Ό μ •μ˜ ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

    class Person {
    	let name: String
    	
    	init(name: String) { self.name = name }
    
    	var apartment: Apartment?
    
    	deinit { print("\(name) is being deinitialized") }
    }
    
    class Apartment {
    	let unit: String
    	
    	init(unit: String) { self.unit = unit }
    
    	var tenant: Person?
    
    	deinit { print("Apartment \(unit) is being deinitialized") }
    }

λͺ¨λ“  Person μΈμŠ€ν„΄μŠ€λŠ” String μ°¨μž…μ˜ name ν”„λ‘œνΌν‹°μ™€ nil둜 μ΄ˆκΈ°ν™” 된 μ˜΅μ…”λ„ νƒ€μž…μ˜ apartmentν”„λ‘œνΌν‹°λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€. μ‚¬λžŒμ΄ 항상 μ•„νŒŒνŠΈλ₯Ό 가지고 μžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμ— apartment ν”„λ‘œνΌν‹°λŠ” μ˜΅μ…”λ„μž…λ‹ˆλ‹€.

μœ μ‚¬ν•˜κ²Œ, λͺ¨λ“  ApartmentλŠ” Stringνƒ€μž…μ˜ unitκ³Ό nil둜 μ΄ˆκΈ°ν™” 된 μ˜΅μ…”λ„ νƒ€μž… tenant을 가지고 μžˆμŠ΅λ‹ˆλ‹€. μ•„νŒŒνŠΈμ— 항상 μ„Έμž…μžκ°€ μžˆλŠ” 것이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— μ„Έμž…μž ν”„λ‘œνΌν‹°λŠ” μ˜΅μ…”λ„ μž…λ‹ˆλ‹€.

두 클래슀 λͺ¨λ‘ 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ ν•΄μ œ λ˜μ—ˆλ‹€λŠ” 사싀을 좜λ ₯ ν•΄μ£ΌλŠ” μ†Œλ©Έμžλ₯Ό μ •μ˜ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이것은 Person와 Apartment의 μΈμŠ€ν„΄μŠ€κ°€ μ˜ˆμƒλŒ€λ‘œ ν•΄μ œ λ˜μ—ˆλŠ”μ§€λ₯Ό λ³Ό 수 있게 ν•΄μ€λ‹ˆλ‹€.

λ‹€μŒ μ½”λ“œλŠ” μ•„λž˜ μ½”λ“œμ—μ„œ νŠΉμ • Apartment와 Person μΈμŠ€ν„΄μŠ€μ— λŒ€μž… 될, μ˜΅μ…”λ„ νƒ€μž…μΈ jinha와 unit4A λΌλŠ” λ‘κ°œμ˜ λ³€μˆ˜λ₯Ό μ •μ˜ ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λ‘κ°œμ˜ λ³€μˆ˜ λͺ¨λ‘ μ˜΅μ…”λ„ 이기 λ•Œλ¬Έμ— nil μ΄λΌλŠ” μ΄ˆκΈ°κ°’μ„ 가지고 μžˆμŠ΅λ‹ˆλ‹€.

    var jinha: Person?
    var unit4A: Apartment?

이제 νŠΉμ • PersonμΈμŠ€ν„΄μŠ€μ™€ Apartment μΈμŠ€ν„΄μŠ€λ₯Ό 생성 ν•  수 있고 이 μΈμŠ€ν„΄μŠ€λ“€μ„ jinha와 unit4A에 ν• λ‹Ή ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    jinha = Person(name: "Jinha Park")
    unit4A = Apartment(unit: "4A")

두 μΈμŠ€ν„΄μŠ€λ“€μ„ μƒμ„±ν•˜κ³  ν• λ‹Ή ν•œ 뒀에 κ°•ν•œ μ°Έμ‘°κ°€ μ–΄λ–»κ²Œ 보여 μ§€λŠ”μ§€ μ—¬κΈ° μžˆμŠ΅λ‹ˆλ‹€. jinha λ³€μˆ˜λŠ” 이제 Person μΈμŠ€ν„΄μŠ€μ— κ°•ν•œ μ°Έμ‘°λ₯Ό 가지고 있고, unit4A λ³€μˆ˜λŠ” ApartmentμΈμŠ€ν„΄μŠ€μ— κ°•ν•œ μ°Έμ‘°λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€.

이제 μ‚¬λžŒμ΄ μ•„νŒŒνŠΈλ₯Ό 갖도둝, λ‘κ°œμ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μ—°κ²° μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€. 그리고 μ•„νŒŒνŠΈλŠ” μ„Έμž…μžλ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€. λŠλ‚Œν‘œ(!)κ°€ 이 μΈμŠ€ν„΄μŠ€λ“€μ˜ ν”„λ‘œνΌν‹°κ°€ μ„ΈνŒ… 될 수 μžˆλ„λ‘ jinha와 unit4A μ˜΅μ…”λ„ λ³€μˆ˜μ— μ €μž₯λ˜μ–΄ μžˆλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μ–Έλž˜ν•‘ν•˜κ³  μ ‘κ·Ό ν•˜κΈ° μœ„ν•΄ μ‚¬μš© 되고 μžˆλŠ” 것에 μ£Όλͺ©ν•˜μ„Έμš”.

    jinha!.apartment = unit4A
    unit4A!.tenant = jinha

여기에 λ‘κ°œμ˜ μΈμŠ€ν„΄μŠ€κ°€ 같이 μ—°κ²° 된 ν›„ κ°•ν•œ μˆœν™˜ μ°Έμ‘°κ°€ μ–΄λ–»κ²Œ λ³΄μ΄λŠ”μ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€.

λΆˆν–‰νžˆλ„, 두 μΈμŠ€ν„΄μŠ€λ₯Ό μ—°κ²° ν•˜λŠ” 것은 그것듀 사이에 κ°•ν•œ μˆœν™˜ μ°Έμ‘°λ₯Ό λ§Œλ“­λ‹ˆλ‹€. Person μΈμŠ€ν„΄μŠ€λŠ” 이제 Apartment μΈμŠ€ν„΄μŠ€μ— κ°•ν•œ μ°Έμ‘°λ₯Ό 가지고 있고, Apartment μΈμŠ€ν„΄μŠ€λŠ” Person μΈμŠ€ν„΄μŠ€μ— κ°•ν•œ μ°Έμ‘°λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, jinha와 unit4A λ³€μˆ˜λ“€μ— μ—°κ²° 된 강함 μ°Έμ‘°λ₯Ό κΉ° λ•Œ, μ°Έμ‘° κ°œμˆ˜κ°€ 0으둜 떨어지지 μ•Šμ„ 것이고, ARC에 μ˜ν•΄ μΈμŠ€ν„΄μŠ€κ°€ ν•΄μ œλ˜μ§€ μ•Šμ„ 것 μž…λ‹ˆλ‹€.

    jinha = nil
    unit4A = nil

이 λ³€μˆ˜λ“€μ— nil을 λŒ€μž…ν•΄λ„ μ†Œλ©Έμž λ˜ν•œ 호좜 λ˜μ§€ μ•ŠλŠ” 것에 μœ μ˜ν•˜μ„Έμš”. κ°•ν•œ μ°Έμ‘° μˆœν™˜μ€ 앱에 λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό λ°œμƒμ‹œν‚€λ©°, Personκ³Ό Apartment μΈμŠ€ν„΄μŠ€κ°€ ν•΄μ œλ˜λŠ” 것을 λ§‰μŠ΅λ‹ˆλ‹€.

이것이 jinha와 unit4A λ³€μˆ˜μ— nil을 λŒ€μž… ν•œ ν›„ κ°•ν•œ μˆœν™˜ 참쑰의 λͺ¨μŠ΅μž…λ‹ˆλ‹€.

PersonμΈμŠ€ν„΄μŠ€μ™€ Apartment μΈμŠ€ν„΄μŠ€ μ‚¬μ΄μ˜ κ°•ν•œ μ°Έμ‘°λŠ” μœ μ§€λ˜κ³  없어지지 μ•ŠμŠ΅λ‹ˆλ‹€.

클래슀 μΈμŠ€ν„΄μŠ€ κ°„μ˜ κ°•ν•œ μˆœν™˜ μ°Έμ‘° ν•΄κ²°ν•˜κΈ°(Resolving Strong Refernce Cycles Between Class Instances)

Swift 클래슀 νƒ€μž…μ˜ ν”„λ‘œνΌν‹°μ™€ κ΄€λ ¨ν•΄μ„œ κ°•ν•œ μˆœν™˜ μ°Έμ‘°λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ weak참쑰와 unownedμ°Έμ‘° 두가지 방법을 μ œκ³΅ν•©λ‹ˆλ‹€.

weakκ³Ό unowned μ°Έμ‘°λŠ” μˆœν™˜ μ°Έμ‘° μ•ˆμ˜ ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€κ°€ λ‹€λ₯Έ μΈμŠ€ν„΄μŠ€λ₯Ό κ°•ν•˜κ²Œ μœ μ§€ν•˜μ§€ μ•Šμ€ μ±„λ‘œ μ°Έμ‘° ν•  수 있게 ν•©λ‹ˆλ‹€. 이 μΈμŠ€ν„΄μŠ€λŠ” κ°•ν•œ μˆœν™˜ μ°Έμ‘°λ₯Ό λ§Œλ“€μ§€ μ•Šκ³  μ„œλ‘œ μ°Έμ‘° ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€λ₯Έ μΈμŠ€ν„΄μŠ€κ°€ 더 짧은 생λͺ… μ£ΌκΈ°λ₯Ό 가지고 μžˆμ„ λ•Œ, 즉 λ‹€λ₯Έ μΈμŠ€ν„΄μŠ€κ°€ λ¨Όμ € ν•΄μ œ 될 수 μžˆμ„ λ•Œ, weakμ°Έμ‘°λ₯Ό μ‚¬μš©ν•˜μ„Έμš”. μœ„μ˜ Apartment μ˜ˆμ œμ—μ„œ, μ•„νŒŒνŠΈλŠ” 생λͺ…μ£ΌκΈ°μ˜ μ–΄λ–€ μ‹œμ μ— μ•„νŒŒνŠΈμ˜ μ„Έμž…μžκ°€ μ—†λŠ” 것이 μ μ ˆν•˜κ³ , κ·Έλž˜μ„œ 이 κ²½μš°μ— weak μ°Έμ‘°λŠ” κ°€ μˆœν™˜ μ°Έμ‘°λ₯Ό κΉ¨λŠ” μ μ ˆν•œ 방법 μž…λ‹ˆλ‹€. λ°˜λŒ€λ‘œ, unowned μ°Έμ‘°λŠ” λ‹€λ₯Έ μΈμŠ€ν„΄μŠ€κ°€ 같은 생λͺ… μ£ΌκΈ°λ₯Ό κ°™κ±°λ‚˜ 더 κΈ΄ 생λͺ…μ£ΌκΈ°λ₯Ό κ°€μ§ˆ λ•Œ μ‚¬μš© ν•˜μ„Έμš”.