control
+I
: ์๋์ผ๋ก ์ค๋ง์ถ๊ธฐcommand
+shift
+y
: ์ฝ์ ์ ๋ค์ด
- Objective-C ์ธ์ด์ ๊ด๋ จ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- ์ปฌ๋ ์
NSArray
,NSMutableArray
,NSDictionary
,NSSet
๋ฑ์ ์ ๊ณตํ๋ค. - ๋ฐ์ดํฐ๋ ๋ ์ง ๊ด๋ จ
NSData
,NSDate
๋ฑ์ ์ ๊ณตํ๋ค. - ์ธ์ธ ํ์๋ ์์!
-
๋ธ๋ฆฌ๊ฒ์ดํธ ์ (Delegate Up)
์๋ธ ํด๋์ค์ ์ง์ ์์ฑ์๋ ์ํผ ํด๋์ค์ ์ง์ ์์ฑ์๋ฅผ ๋ฐ๋์ ํธ์ถํด์ผํ๋ค.
-
๋ธ๋ฆฌ๊ฒ์ดํธ ์ดํฌ๋ก์ค(Delegate across)
ํธ์ ์์ฑ์๋ ๋์ผํ ํด๋์ค์์ ๋ค๋ฅธ ํธ์ ์์ฑ์ ๋๋ ์ง์ ์์ฑ์๋ฅผ ํธ์ถํด์ผํ๊ณ ๊ถ๊ทน์ ์ผ๋ก๋ ์ง์ ์์ฑ์๋ฅผ ํธ์ถํด์ผํ๋ค.
์ ํ์ด ์ต์ด๋ก ํ๋กํ ์ฝ ์งํฅ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ์ ์ํ๋ค.
ํด๋์ค์ ์์์ ๋จ์
- ํ๋์ ํด๋์ค๋ง ์์์ด ๊ฐ๋ฅํ๋ค.
- ํ์ํด๋์ค๋ ์์ํด๋์ค์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ผ๊ฐ ์ ๋ฐ์ ์๋ค.
- ํด๋์ค์์๋ง ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง ํ๋กํ ์ฝ ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ผ ๊ฒฝ์ฐ?
- ์ฌ๋ฌ๊ฐ์ ํ๋กํ ์ฝ ์ฑํ์ด ๊ฐ๋ฅํ๋ค. โ ์กฐํฉ์ ์ฅ์ ์ ์ด๋ ค์ ๊ตฌ์ฑ/์ฌ์ฌ์ฉ์ฑ์ ๋์ผ ์ ์๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ๋ํ ํน์ ์๊ตฌ์ฌํญ์ด ์๋ค. โ ํ์ํ ์์ฑ/๋ฉ์๋๋ง ์ฑํํด์ ์ฌ์ฉํ ์ ์๋ค.
- ๋ชจ๋ ํ์ ์์ ์ฑํ์ด ๊ฐ๋ฅํ๋ค. โ ํ์ฉ์ฑ์ด ๋์ด๋๋ค.
์ค์ํํธ๊ฐ ํจ์๋ฅผ ์คํ์ํค๋ ๋ฐฉ๋ฒ์ ๋ค์ ์ธ ๊ฐ์ง๊ฐ ์๋ค.
-
Direct Dispatch
์ปดํ์ผ ์์ ์ ์ฝ๋ ์์ฒด์ ํจ์์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ์ฝ์ ๋๋ ํจ์์ ๋ช ๋ น ์ฝ๋๋ฅผ ํด๋น ์์น์ ์ฝ๋๋ฅผ ์ฌ๋๋ฐฉ์์ด๋ค. ์ธ ๋ฐฉ์์ค์ ๊ฐ์ฅ ๋น ๋ฅด์ง๋ง value type์ธ ๊ตฌ์กฐ์ฒด์ ์ด๊ฑฐํ์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์์๊ณผ ๋คํ์ฑ์ ์ฅ์ ์ ๋๋ฆด ์ ์๋ค.
-
Table Dispatch
ํจ์์ ํฌ์ธํฐ๋ฅผ ๋ฐฐ์ด์ ๋ณด๊ด ํ ์คํํ๋ ๋ฐฉ์์ด๋ค. ์ธ ๋ฐฉ์์ค์ ๋๋ฒ์งธ๋ก ๋น ๋ฅด๋ฉฐ ํด๋์ค์ ํ๋กํ ์ฝ์์ ์ฌ์ฉํ๋ค. ํด๋์ค๋ Virtual Table, ํ๋กํ ์ฝ์ Witenss Table์ ์ฌ์ฉํ๋ค.
-
Message Dispatch
์์๊ตฌ์กฐ๋ฅผ ๋ชจ๋ ํ์ ํ์ ์คํํ ๋ฉ์๋๋ฅผ ๊ฒฝ์ ํ๋ ๋ฐฉ์์ด๋ค. ์ธ ๋ฐฉ์์ค์ ๊ฐ์ฅ ๋๋ฆฌ๋ฉฐ ์ฃผ๋ก Objective-C ํด๋์ค์์ ์ฌ์ฉํ๋ค.
ARC๋ ์ค์ํํธ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ชจ๋ธ์ด๋ค. Automatic Reference Counting์ ์ค์๋ง๋ก, ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ์ ์ซ์๋ฅผ ์ผ๋ค. ๋ง์ฝ ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ค๋ฉด, ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์ง์ผํ๋ค.
class Point {
var refCount: Int // ์ฐธ์กฐ ์ซ์๋ฅผ ์ธ์ฃผ๋ ๋ณ์
var x, y: Double
func draw() { ... }
}
let point1 = Point(x: 0, y: 0) // +1, refCount = 1
let point2 = point1
retain(point2) // +1, refCount = 2
point2.x = 5
release(point1) // -1, refCount = 1
release(point2) // -1, refCount = 0 -> ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํด์
retain()
โ Reference Counting์ ์ซ์๋ฅผ ํ๋ ์ฌ๋ฆฐ๋ค.
release()
โ Reference Counting์ ์ซ์๋ฅผ ํ๋ ๋ด๋ฆฐ๋ค.
๋ฐ๋ผ์, Referece Counting์ด 0์ด ๋๋ ์๊ฐ ๋ฉ๋ชจ๋ฆฌํ ๋น์ ํด์ ํ๋ค.
์ค์ํํธ์ ARC๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ retain
, release
๋ฅผ ์ ๊ฒฝ ์์จ๋ ์ปดํ์ผํ ๋ ์๋์ผ๋ก ์ํํ๋ค.
๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด์ ๊ฐ์ฒด ๋ ๊ฐ๊ฐ ์๋ก๋ฅผ ์ฐธ์กฐํ๊ณ ์์ด, ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ํด์ ๊ฐ ์๋๊ณ ํด์ ์ํฌ ๋ฐฉ๋ฒ๋ ์๋ ํ์์ด๋ค.
class Dog {
var name: String
var owner: Person?
init(name: String) {
self.name = name
}
deinit { // ์๋ฉธ์
print("\(name) ๋ฉ๋ชจ๋ฆฌ ํด์ ")
}
}
class Person {
var name: String
var pet: Dog?
init(name: String) {
self.name = name
}
deinit {
print("\(name) ๋ฉ๋ชจ๋ฆฌ ํด์ ")
}
}
var bori: Dog? = Dog(name: "๋ณด๋ฆฌ")
var gildong: Person? = Person(name: "ํ๊ธธ๋")
bori?.owner = gildong
gildon?.pet = bori
// --> ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด ๋ฐ์
bori = nil // ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ถ๊ฐ
gildong = nil // ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ถ๊ฐ
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด โ๋ณด๋ฆฌโ์ ์ฃผ์ธ์ โ๊ธธ๋โ์ด๊ณ โ๊ธธ๋โ์ ์ ์๋๋ฌผ์ โ๋ณด๋ฆฌโ์ด๊ธฐ ๋๋ฌธ์, ๋ ๊ฐ์ฒด๊ฐ ์๋ก๋ฅผ ์ฐธ์กฐํ๊ณ ์์ด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๋ค.
๋ฉ๋ชจ๋ฆฌ ๋์์ ํด๊ฒฐ๋ฐฉ์ 2๊ฐ์ง
๋ฉ๋ชจ๋ฆฌ ๋์์ ํด๊ฒฐ๋ฐฉ์ 2๊ฐ์ง๋ฅผ ์ฌ์ฉํ๋ฉด ๊ณตํต์ ์ผ๋ก Referece Counting ์ฌ๋ผ๊ฐ์ง ์๋๋ค.
-
์ฝํ ์ฐธ์กฐ(Weak Reference)
๋จ์ํ ์์
weak
ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.class Dog { var name: String weak var owner: Person? init(name: String) { self.name = name } deinit { // ์๋ฉธ์ print("\(name) ๋ฉ๋ชจ๋ฆฌ ํด์ ") } } class Person { var name: String weak var pet: Dog? init(name: String) { self.name = name } deinit { print("\(name) ๋ฉ๋ชจ๋ฆฌ ํด์ ") } } var bori: Dog? = Dog(name: "๋ณด๋ฆฌ") var gildong: Person? = Person(name: "ํ๊ธธ๋") // ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด ๋ฐ์ํ์ง ์์ bori?.owner = gildong gildon?.pet = bori bori = nil // print("๋ณด๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ํด์ ") gildong = nil // print("ํ๊ธธ๋ ๋ฉ๋ชจ๋ฆฌ ํด์ ")
์ฝํ ์ฐธ์กฐ์ ๊ฒฝ์ฐ, ์ฐธ์กฐํ๊ณ ์๋ ์ธ์คํด์ค๊ฐ ์ฌ๋ผ์ง๋ฉด,
nil
๋ก ์ด๊ธฐํ๊ฐ ๋์ด์๋ค.nil
์ ํ ๋นํ ์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์weak let
์ด๋ Non-Optional ์ ์ธ์ด ๋ถ๊ฐ๋ฅํ๋ค. ๋ฐ๋ผ์ ์์ ์์ ๋นํด ์งง์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
-
๋น์์ ์ฐธ์กฐ(Unowned Referece)
์ฝํ ์ฐธ์กฐ์ ๋๊ฐ์ด ์์
unowned
ํค์๋๋ฅผ ๋ถ์ธ๋ค.class Dog { var name: String unowned var owner: Person? init(name: String) { self.name = name } deinit { // ์๋ฉธ์ print("\(name) ๋ฉ๋ชจ๋ฆฌ ํด์ ") } } class Person { var name: String unowned var pet: Dog? init(name: String) { self.name = name } deinit { print("\(name) ๋ฉ๋ชจ๋ฆฌ ํด์ ") } } var bori: Dog? = Dog(name: "๋ณด๋ฆฌ") var gildong: Person? = Person(name: "ํ๊ธธ๋") // ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด ๋ฐ์ํ์ง ์์ bori?.owner = gildong gildon?.pet = bori bori = nil // print("๋ณด๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ํด์ ") gildong = nil // print("ํ๊ธธ๋ ๋ฉ๋ชจ๋ฆฌ ํด์ ")
์ฝํ ์ฐธ์กฐ์ ๋ค๋ฅด๊ฒ ๋น์์ ์ฐธ์กฐ๋ ์ฐธ์กฐํ๊ณ ์๋ ์ธ์คํด์ค๊ฐ ์ฌ๋ผ์ง๋ฉด,
nil
๋ก ์ด๊ธฐํ ๋์ง ์๋๋ค. ๋ฐ๋ผ์ ์์ ์ ๋ณด๋ค ์ธ์คํด์ค์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๋ ๊ธธ๊ฑฐ๋, ๊ฐ์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.์ ์์ ๋ค์ ๋ดค๋ฏ์ด,
unowned
์ฌ์ฉ์์๋ ํ๋ฒ ๋ ๊ณ ๋ คํ ๊ฒ์ด ์๊ธฐ ๋๋ฌธ์, ์ค์ ๋ก๋weak
ํค์๋๋ฅผ ์ฌ์ฉํ๋ ์ฝํ ์ฐธ์กฐ๋ฅผ ํ๋ก์ ํธ์์ ๋ ๋ง์ด ์ฌ์ฉํ๋ค.
viewDidLoad
- ์คํ ๋ฆฌ๋ณด๋์์ ๋ทฐ๋ค๊ณผ์ ์ฐ๊ฒฐ์ด ๋๋ ์์ viewWillAppear
- ์ค์ ์คํฌ๋ฆฐ์ ๋ทฐ๊ฐ ๋ํ๋๊ธฐ ์ ์ ํธ์ถviewDidAppear
- ์ค์ ์คํฌ๋ฆฐ์ ๋ทฐ๊ฐ ๋ํ๋ ํ์ ํธ์ถviewWillDisappear
- ์ค์ ์คํฌ๋ฆฐ์ ๋ทฐ๊ฐ ์ฌ๋ผ์ง๊ธฐ ์ ์ ํธ์ถviewDidDisappear
- ์ค์ ์คํฌ๋ฆฐ์ ๋ทฐ๊ฐ ์ฌ๋ผ์ง ํ์ ํธ์ถ