ํจ์ ์์์ ์์ฑ ์์น์ ์๊ด์์ด ํจ์๊ฐ ์ข ๋ฃ๋๊ธฐ ์ ์ ์ฌ์ฉ๋๋ ํด๋ก์ ์ ๋๋ค.
defer๋ฅผ ์์ด ๊ทธ๋๋ก ํด์ํ์ฌ ํจ์ ์ข ๋ฃ ์ง์ ๊น ์คํ์ ๋ฏธ๋ฃจ๋ค ๋ผ๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค.
ํจ์ ์์์ ์ด๋์๋ defer๋ฅผ ๊ตฌํํ๋ฉด ๋ฉ๋๋ค.
func testDefer() {
print("#1")
defer { print("#2") }
print("#3")
}
์ผ๋ฐ์ ์ธ ์คํ ์์์ ์ํ๋ฉด
#1
#2
#3
์ด ๋ง๋ ์์๊ฒ ์ง๋ง #2์ defer ํด๋ก์ ๋ฅผ ์ฌ์ฉํ์ผ๋ฏ๋ก ์ ํจ์์ ์คํ ๊ฒฐ๊ณผ๋
#1
#3
#2
์ ์์๋ก ์ถ๋ ฅ๋ฉ๋๋ค.
- defer๋ฅผ ์ฝ๊ธฐ ์ ์ ํจ์๊ฐ ์ข ๋ฃ๋๋ฉด defer๋ ์คํ๋์ง ์๋๋ค.
func testDefer() {
print("#1")
return
defer { print("#2") }
print("#3")
}
์์๊ฐ์ด defer๊ฐ ์ฝํ๊ธฐ๋ ์ ์ ์ข ๋ฃ๋ ๊ฒฝ์ฐ defer๋ ์คํ๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์ ํจ์์ ์ถ๋ ฅ์
#1
์ด ๋ฉ๋๋ค.
2.defer์ ์คํ ์์๋ ์ฝ์ ์์์ ์ญ์์ด๋ค.
stack์ ๋ด๊ฒจ์ ธ์๋ค๊ฐ ํธ์ถ์ด ๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
func testDefer() {
defer { print("#1") }
defer { print("#2") }
defer { print("#3") }
}
์ ํจ์์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ์ถ๋ ฅ๋ฉ๋๋ค.
#3
#2
#1
- defer๋ ์ค์ฒฉ์ด ๊ฐ๋ฅํ๋ฉฐ ๋ฐ๊นฅ์ชฝ ๋ถํฐ ์คํ๋๋ค.
func testDefer() {
defer {
defer {
defer {
print("defer #3")
}
print("defer #2")
}
print("defer #1")
}
}
์ ํจ์์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
#1
#2
#3
ํจ์ ์ข
๋ฃ ์ ๋ณ์๋ ์์๋ฅผ ์ฒ๋ฆฌ์ฉ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
์๋ฅผ๋ค์ด NSLock ์ด์ฉ์
let myLock: NSLock = .init()
func fetchData() {
myLock.lock()
defer { myLock.unlock() }
if data == nil { return }
//์ดํ ์์
~.~