๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์๊ณ ๊ณ์ ๊ฐ์?
๋ญ๋ฑ๊ทธ๋ ค ๋งํ๋ฉด, ๋ง ๊ทธ๋๋ก ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๊ณ ์๋ค๋ ๋ง์
๋๋ค,, ๋ง!
์ ํํ ๋งํ๋ฉด, ํ๋ก๊ทธ๋จ์ด ํ์ํ์ง ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ ํ๊ณ ์๋ ํ์์ ๋งํฉ๋๋ค.
์ฆ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ์ฌ ๋์ด์ ์ฐ์ง ์์ผ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ฅผ ํด์ผ ํ๋๋ฐ, ์ด๊ฒ์ด ์ ๋๋ก ์ด๋ฃจ์ด์ง์ง ์๊ณ ์๋ ๊ฒ์ด์ฃ .
๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ๊ฑด๋๋ ์ผ์ด ์์ด๋ณด์ด๋ Swift์์๋ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค!
์ด์งธ์์ผ๊น์?
0. ์ฌ๊ฑด ๋ฐ์
์, ์ฌ๊ธฐ ์ค๋ธ์ ํธ ํด๋์ค๊ฐ ์์ต๋๋ค. ๋ค๋ฅธ ์ค๋ธ์ ํธ๋ฅผ ์ ์ธ์ผ๋ก ํ๋!
๋ํ, ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ณผ ํด์ ์์ ์ค๋ธ์ ํธ์ ์ฃผ์๋ฅผ ํธ์ถํ๋ ํด๋์ค๋ฅผ ์์๋ฐ๊ณ ์์ต๋๋ค.
class Object:AddressPrinter{
var lover: Object?
}
class AddressPrinter{
init(){
print( "\(Unmanaged.passUnretained(self).toOpaque()) \(type(of: self)) allocated")
}
deinit{
print( "\(Unmanaged.passUnretained(self).toOpaque()) \(type(of: self)) deallocated")
}
}
์ด์ ์์์ ๊ฐ์ฒด kim๊ณผ lee๋ฅผ ์์ฑํ๊ณ , ์๋ก๋ฅผ ์ ์ธ์ผ๋ก ์ผ์๋ค๊ณ ์นฉ์๋ค.
var kim:Object? = Object()
var lee:Object? = Object()
kim!.lover = lee
lee!.lover = kim
๊ทธ๋ฆฌ๊ณ ์ ๋ ์ด ์ค๋ธ์ ํธ๋ค์ ๋์ด์ ์ฐ์ง ์๊ณ ์ถ์ผ๋ฏ๋ก nil์ ํ ๋นํ๋ฉด์ ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐ์ํฌ๊ฒ๋๋ค.
์ด๋ค ์ผ์ด ๋ฒ์ด์ง๊น์?
์๋ก ๊ฐ์ ํด๋์คํ์
์ด๋ผ ์ด๋ฐ์ผ์ด ๋ฒ์ด์ง๋ ๊ฑธ๊น์?
๊ทธ๋ ๋ค๋ฉด ์ด๋ฒ์๋ kim๊ณผ lee๋ฅผ ์๋ก ๋ค๋ฅธ ํด๋์ค๋ก ์์ฑํ ๋ค, nil์ ํ ๋น ํด ๋ณด๋๋ก ํ์ฃ .
class Object:AddressPrinter{
var lover: Subject?
}
class Subject:AddressPrinter{
var lover: Object?
}
class AddressPrinter{
init(){
print( "\(Unmanaged.passUnretained(self).toOpaque()) \(type(of: self)) allocated")
}
deinit{
print( "\(Unmanaged.passUnretained(self).toOpaque()) \(type(of: self)) deallocated")
}
}
var kim:Object? = Object()
var lee:Subject? = Subject()
kim!.lover = lee
lee!.lover = kim
kim = nil
lee = nil
๊ฐ์ ํด๋์ค๋ฅผ ์์๋ฐ๊ณ ์์ด์ ๊ทธ๋ ๋ค๊ตฌ์? ์ ๋นํ ํ์ธ์. ์์ค์ฝ๋๋ฅผ ์ ์ด๋์์ผ๋ ์ง์ ํด๋ณด์๋๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
์๋ฌดํผ, ๋ฌ๋ผ์ง๊ฒ์ด ์๊ตฐ์.
๋ชจ๋ ๊ฒฝ์ฐ์, ํ ๋น์ ๋์๋๋ฐ ํด์ ๋ ๋์ง ์๋ ๊ธฐ๋ฌํ ์ํฉ์ด ๋ฒ์ด์ง๋๋ค.
ํด์ ๊ฐ ๋์ง ์์์ผ๋, kim๊ณผ lee๊ฐ ์ด๋๊ฐ์ ๋จ์์๋ค๋ ๋ป์ด๊ฒ ์ฃ ?
ํ์ง๋ง ์ ๋ ๊ทธ ์ด๋์์๋ ์ด๋
์๋ค์๊ฒ ์ ๊ทผํ ์ ์์ต๋๋ค. ๋ ์ด์ ์ฐ์ง ์๋ ๋
์๋ค์ธ๋ฐ, ์ด๋ป๊ฒ ํด์ผ ์์ ํ ํด์ ์ํฌ ์ ์์๊น์?
์ด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ๊ด๋ฆฌํด์ผ ํ๋ ๊ฑธ๊น์? Swift๋ ๊ฑฐ์ง๋ง์์ด์๋๊ฑด๊ฐ์...?
1. ์์ธ ํ์
Swift๋ ARC๋ผ๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณ์ ์ณ๋ค๋ณด๊ณ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ Swift์์ Class๋ Referenceํ์
์ผ๋ก, Value๋ฅผ ๋ณต์ฌํ๋๊ฒ์ด ํ๋ Reference๋ฅผ ๋ณต์ฌํฉ๋๋ค.
์ดํด๊ฐ ์๋์ ๋ค๋ฉด, ์ฌ๊ธฐ์์ ์ ์ค๋ช
ํ๊ณ ์์ต๋๋ค. ์ด์ฉ๋ฉด Swift๋ฅผ ๋ค์ ๊ณต๋ถํ์๋๊ฒ ๋์์ด ๋ ์๋ ์์ต๋๋ค.
Swift์์๋ A๊ฐ Referenceํ์
์ด๋ฉด, A๋ฅผ ์ด๋๊ฐ๋ก ๋ณต์ฌํ ๋ ๊ฐ์ด ์๋ ์ฐธ์กฐ(๋ฉ๋ชจ๋ฆฌ ์ฃผ์)๋ฅผ ๋ณต์ฌํ์ฌ ๋ฃ์ด์ค๋๋ค.
kim.lover = lee ์์ ๋๋ค๋ฅธ lee๋ฅผ ๋ง๋ค์ด ๋ฃ๋๊ฒ์ด ์๋, lee์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ณต์ฌํ์ฌ ๋ฃ๋๋ค๋ ๋ง์ด์ฃ .
(์ฌ์ค lee์กฐ์ฐจ๋ ์ด๋๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ด๊ณ ์๋ต๋๋ค!)
์ด๋ ARC๋ lee์ ์ฃผ์๊ฐ ๋ณต์ฌ๋ ๋ ๋ง๋ค ํ์๋ฅผ ์ธ๊ณ , ๋ณต์ฌ๋ ๋ณ์๊ฐ ํด์ ๋ ๋ ๋ง๋ค ํ์๋ฅผ ์ฐจ๊ฐํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ์๊ฐ 0์ด ๋ ๋, lee๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ์์ผ ๋ฒ๋ฆฌ๋๊ฒ์ด์ฃ .
Swift๋ ์ด ํ์๋ฅผ ์ฐธ์กฐ ์นด์ดํธ(Reference count)๋ผ ํ๊ณ , ARC๋ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ธ์ด 0์ด ๋ ๋ ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ์ฒด๋ฅผ ํด์ ์ํต๋๋ค.
'์ํ์ฐธ์กฐ'๋ ๊ฐ์ฒด A์ B์ ๋ํ์ฌ A๊ฐ B๋ฅผ ์ฐธ์กฐํ๊ณ ์๊ณ , B๊ฐ A๋ฅผ ์ฐธ์กฐํ๊ณ ์์ ๋ ๋ฐ์ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ A์ B๋ ์ฒ์ ์ด๋๊ฐ ํ ๋น๋์์ ๋ ์ฐธ์กฐ ์นด์ดํธ๊ฐ ๊ฐ๊ฐ 1์ฉ ์ฆ๊ฐํ๊ณ , ์๋ก๋ฅผ ์ฐธ์กฐํ ๋ ๋ค์ 1์ฉ ์ฆ๊ฐํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด, A์ B๊ฐ ์ฐธ์กฐ๋๊ณ ์๋ ๋ชจ๋ ๊ณณ์ nil์ ํ ๋นํ๋ฉด ๋ฉ๋ชจ๋ฆฌ์์ ์ฌ๋ผ์ง์ง ์๊ฒ ์ต๋๊น?
kim?.lover = nil
lee?.lover = nil
kim = nil
lee = nil
์ ๋ต์
๋๋ค! ์ด์ A๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ๋ชจ๋ ๊ณณ์ nil์ ํ ๋นํ๋ฉด ์ด๋ฐ์ผ์ ๋ฐ์ํ์ง ์๊ฒ ๊ตฐ์.
๊ทธ๋ฐ๋ฐ ๊ทธ๊ฒ์ ๋๋ฌด ๋ฒ๊ฑฐ๋ก์ด ์ผ ์
๋๋ค. ์ฐจ๋ผ๋ฆฌ ๋ณต์ฌํ ๋ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ธ์ง ์๊ฒ ํ๋ฉด ์ด๋จ๊น์?
์ด๋ Swift์ ํค์๋ 'weak'์ด ๋ฑ์ฅํฉ๋๋ค.
2. ํด๊ฒฐ
weak ํค์๋๋ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ๋ ์ฝํ ์ฐธ์กฐ๋ก ์ฐธ์กฐํ๊ฒ ๋๊ณ ๋ค์ ํ๋์ ํ๋๋ก ๋ง๋ญ๋๋ค.
- ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ฆ๊ฐ์ํค์ง ์์ต๋๋ค.
- ์ฐธ์กฐํ๊ณ ์๋ ๊ฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ ๋ nil์ ํ ๋นํฉ๋๋ค.
๊ทธ๋ผ ํ์์ ์ฐ๋๊ฑด ๋ฌด์จ ์ฐธ์กฐ ์ผ๊น์? ๋ณ๋ค๋ฅธ ํค์๋๊ฐ ๋ถ์ง ์์๋ค๋ฉด, ๊ทธ๊ฒ์ ๊ฐํ ์ฐธ์กฐ์
๋๋ค.
์, ์ด์ object์ lover์ weak๋ฅผ ๋ฌ์ ์ฝํ ์ฐธ์กฐ๋ก ๋ง๋ค์ด ์ํ์ฐธ์กฐ๋ฅผ ๋์ด๋ณด๊ฒ ์ต๋๋ค.
class Object:AddressPrinter{
weak var lover: Subject?
}
...
lee = nil
kim์ lee๋ฅผ ์ฝํ์ฐธ์กฐํ๊ณ ์์ผ๋, lee์ nil์ ํ ๋นํ๋ฉด lee๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐ๋๊ฒ ์ฃ ?
lee๊ฐ ์ ์ฌ๋ผ์ก์์ ์ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ์ ๊ฐ ํด๋งค๋ ๋ถ๋ถ์ด ์๋๋ฐ์, ๋ค์ ์ฝ๋์ ๊ทธ ์ฃผ์์ ๋ด ์ฃผ์์ง์
var kim:Object? = Object() //kim์ ์ฐธ์กฐํ์ 1
var lee:Subject? = Subject() //lee์ ์ฐธ์กฐํ์ 1
kim?.lover = lee //kim์ ์ฐธ์กฐํ์ 1, lee์ ์ฐธ์กฐํ์ 1
lee?.lover = kim //kim์ ์ฐธ์กฐํ์ 2, lee์ ์ฐธ์กฐํ์ 1
lee = nil //lee์ ์ฐธ์กฐํ์ 0, kim์ ์ฐธ์กฐํ์ 2
kim = nil //kim์ ์ฐธ์กฐํ์ 1, lee์ ์ฐธ์กฐํ์ 0
๋ถ๋ช
์ฐ๋ฆฌ๊ฐ ์๊ธฐ๋ก๋ kim์ ์ฐธ์กฐํ์๋ ์์ง ๋จ์์์ผ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ์ ๋จ์์๊ฒ ์ง์?
๊ทธ๋ฐ๋ฐ ์ด ๊ฒฝ์ฐ์๋ kim์ ํด์ ๊ฐ ๋ฉ๋๋ค
์ ์ผ๊น์?
์ฌ๊ธฐ์์ ์ ์ค๋ช
ํด์ฃผ๊ณ ์๋๋ฐ, ARC๋
์ด๋ค ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์์ ๋
๊ทธ ์ธ์คํด์ค์ ํ๋กํผํฐ๊ฐ ๋ค๋ฅธ ์ธ์คํด์ค์ ํ๋กํผํฐ๋ฅผ ๊ฐ๋ฅดํค๊ณ ์๋ค๋ฉด
ARC๋ ๊ฐ๋ฅดํค๋ ์ธ์คํด์ค ํ๋กํผํฐ์ RC๋ฅผ 1 ๊ฐ์์ํจ๋ค.
์ด๊ฑธ ๋ชฐ๋ผ์ ์ฐธ์กฐ์นด์ดํธ๋ฅผ 2์๊ฐ๋์ ๋ค์ ์ธ๊ณ ์์๋ค๋,, ARC๊ณต๋ถ ๋ค์ํด์ผ๊ฒ ์ต๋๋ค
์ด๋ก์จ ์๋ก๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ ํด๋์ค๋ค์ ์ ์์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐ๋์์ต๋๋ค.
์ด๋์ชฝ์ weak๋ฅผ ๋ฌ์์ผ ํ ์ง ๊ณ ๋ฏผ์ด์๋ผ๋ฉด, ๋จผ์ ์ฃฝ๋์ชฝ์ ๊ฐ๋ฆฌํค๋ ํ๋กํผํฐ์ weak๋ฅผ ๋ค๋๊ฒ์ด ๋ฐ๋์งํ ๋ฐฉํฅ์
๋๋ค.
์๋ํ๋ฉด, nil์ด ๋ ์๋ ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ ๊ณณ์ ์ฐธ์กฐํ๊ณ ์์ผ๋๊น์!
์ด ์ธ์๋ unowned ์ฐธ์กฐ, ํด๋ก์ ์์ ๋ฐ์ํ๋ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฑ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๋ํ ์ด์ผ๊ธฐ๋ ๋ ๋จ์์ต๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๋ค๋ฅธ ํฌ์คํ
์์ ๋ ๋ง๋์!
์ฐธ๊ณ ํ ๊ธ
์๋ ์ฐธ์กฐ ์นด์ดํ (Automatic Reference Counting) | Swift
๊ฐ์ฒด์ ๋ผ์ดํํ์๊ณผ ๊ด๊ณ๋ฅผ ๋ชจ๋ธ๋งํฉ๋๋ค. Swift๋ ์ฑ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ถ์ ํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํด ์๋ ์ฐธ์กฐ ์นด์ดํ (Automatic Reference Counting) (ARC)๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ Swift์์ ๋ฉ๋ชจ๋ฆฌ
bbiguduk.gitbook.io
iOS) ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ (1/3) - ARC(Automatic Reference Counting)
์๋ ํ์ธ์~~ ์๋ค์ ๋๋ค ๐ ์ค๋์ ์ง๋ ์๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ์ด์ด Swift๋ฅผ ์ฌ์ฉํ ๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ์ด๋ค ์์ผ๋ก ๋๋์ง์ ๋ํด ๊ณต๋ถํด๋ณผ ๊ฑฐ์์ :) ARC ๋ฉด์ ๋จ๊ณจ ์ง๋ฌธ์ด๋ผ์ฃ ? ๊น๊น iOS ๊ฐ๋ฐ์๋ผ
babbab2.tistory.com
๋ฒผ๋ฆฌ๋ค๋ ๋ธ๋ก๊ทธ(์ง์ ๊ทธ๋ฆฐ ๊ทธ๋ฆผ์ผ๋ก ์ค๋ช ํด์ฃผ์ ์ ๊ฐ๋์ ์ด์์)
[๋ฌธ๊ณผ ์ฝ๋ฆฐ์ด์ IT ๊ธฐ๋ก์ฅ] IOS Swift - ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ / ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ ๋ฐฉ๋ฒ (weak / strong / unowned)
[๋ฌธ๊ณผ ์ฝ๋ฆฐ์ด์ IT ๊ธฐ๋ก์ฅ] IOS Swift - ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ / ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ ๋ฐฉ๋ฒ (weak / strong / unowned) 1. ARC (Automatic Reference Counting = ์๋ ์ฐธ์กฐ ๊ณ์) - IOS์์ ์ฑ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์๋์ผ๋ก ์ถ์ ๋ฐ ๊ด๋ฆฌํด์ฃผ๋
vansoft1215.tistory.com
'learnings > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS/Swift] ๋ทฐ ์ขํ๊ณ์ UIView.Frame (2) | 2024.08.26 |
---|---|
[iOS/Swift] ์๋ฉธ์๋ฅผ ์ฌ์ฉํ ๋ฉ๋ชจ๋ฆฌ ํด์ (0) | 2024.03.26 |
[iOS/Swift] TableView์์ SnapScroll (magnetic scroll) ๊ตฌํ (0) | 2023.01.20 |
[iOS/Swift] #1-2 ๋์ ์ฒซ ํ ์ดํ๋ก์ ํธ (0) | 2021.09.23 |
[iOS/Swift] #1-1 ๋์ ์ฒซ ํ ์ดํ๋ก์ ํธ (0) | 2021.09.21 |