짧은인사, 하루의 사건, 나의 행동
금, 토, 일요일을 신나게 쉬었습니다.. 하하 금요일은 어머니 생신을 같이 보냈구요, 토요일은 여자친구와 함께 시간을 보냈습니다~
일요일은 늑연골염 덕분에 거의 누워있었던것 같습니다...
이정도면 많이 쉬었군요. 어제 장수상회를 보며 눈물을 질질 흘렸습니다.. 얼마나 슬프던지 배우분들을 보면서 할머니랑 할아버지 생각이 나 눈물이 더 많이 났던것 같네요.. 여러분들도 한번쯤은 보면 좋은 영화입니다 가족애 뿜뿜 ㅎㅎ
흐 계속 쉬고싶지만.. 누워만 있는건 조금 찔리는것 같네요 하하하...흐...ㅎ...ㅡ....ㅠㅠ,,,,
배운점
저번에 다하지 못한 미소유 참조 와 약한참조를 공부해보겠습니다!
약한 참조
약한 참조는 참조하는 인스턴스를 강하게 유지하지 않는 참조이므로 ARC가 참조된 인스턴스를 처리하는것을 중지하지 않는다고 합니다.
이 동적운 참조가 강한 참조 사이클의 일부가 되는 것을 방지합니다!
프로퍼티나 변수의 선언 앞에 weak 키워드를 위치시켜 약한참조를 나타냅니다.
약한 참조는 참조하는 인스턴스를 강하게 유지하지 않기 때문에 약한 참조가 참조하는 동안 인스턴스가 할당 해제 될 수 있습니다!
따라서 ARC는 인스턴스가 해제되면 nil 로 약한 참조를 자동으로 설정합니다.
따라서 nil 로 바뀌는 것을 허락 해야하므로 옵셔널 타입의 변수로 선언됩니다.
다른 옵셔널 값과 같이 약한 참조에 값의 존재를 확인할 수 있고, 더이상 존재하지 않는 유효하지 않은 인스턴스에 참조하는것으로 끝나지 않습니다 (????) -> 약한 참조는 옵셔널 값과 유사하지만, 옵셔널 값처럼 유효하지 않은 인스턴스를 참조할수 없다는 것을 의미하는것 같네요..
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 }
weak var tenant: Person?
deinit { print("Apartment \(unit) is being deinitialized") }
}
위의 코드는 Apartment 클래스의 tenant 프로퍼티는 약한참조로 선언되었습니다.
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john
이전과 같이 john과 ubut4A는 강한참조로 연결됩니다.
Person 인스턴스는 Apartment 인스턴스에 대해 강한 참조를 가지고 있지만 Apartment 인스턴스는 Person 인스턴스에 대해 약한참조를 가지고 있습니다. -> john 변수에 nil 을 할당하여 강한참조를 끊으면 Person 인스턴스에 대해 더이상 강한참조가 아님을 의미합니다.
john = nil
// Prints "John Appleseed is being deinitialized"
더이상 Person 인스턴스에 대해 강한 참조를 가지고 있지 않기 때문에 할당 해제되고 tanant 프로퍼티는 nil 이 됩니다.
Apartment 인스턴스에 대한 유일한 참조는 unit4A 변수에서 가져온 것입니다. 강한참조를 끊으면 Apartment 인스턴스에 대한 강한참조는 더이상 없습니다.
unit4A = nil
// Prints "Apartment 4A is being deinitialized"
Apartment에 대한 강한참조가 없으니 할당 해제 됩니다.
미소유 참조
미소유 참조는 약한 참조와 같이 인스턴스를 강하게 유지하지 않습니다. 하지만 약한 참조와 다르게 미소유 참조는 다른 인스턴스의 수명이 같거나 더 긴 경우에 사용됩니다.
프로퍼티 선언 앞부분에 unowned 키워드를 붙여 미소유 참조를 나타냅니다.
약한 참조와 달리 미소유 참조는 항상 값을 갖도록 예상됩니다. 따라서 미소유로 만들어진 값은 옵셔널이 아니고, ARC는 미소유 참조의 값을 nil로 할당하지 않습니다.
class Customer {
let name: String
var card: CreditCard?
init(name: String) {
self.name = name
}
deinit { print("\(name) is being deinitialized") }
}
class CreditCard {
let number: UInt64
unowned let customer: Customer
init(number: UInt64, customer: Customer) {
self.number = number
self.customer = customer
}
deinit { print("Card #\(number) is being deinitialized") }
}
위의 예제는 Customer 와 CreditCard의 관계입니다. 고객은 신용카드를 가지고 있거나 아닐수 있지만, 신용카드는 항상 고객과 연관되어 있습니다.
신용카드의 인스턴스는 참조하는 고객보다 오래 지속되지 않습니다. -> 고객 클레스는 옵셔널 card를 가지지만, 신용카드 클래스는 미소유와 옵셔널이 아닌 customer 프로퍼티를 가집니다.
신용카드는 항상 고객을 가지고 있으므로 강한 참조 사이클을 피하기 위해 customer 프로퍼티에 미소유 참조로 정의합니다.
var john: Customer?
john = Customer(name: "John Appleseed")
john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)
john에 Customer 인스턴스를 할당하고, card프로퍼티에 CreditCard 인스턴스를 할당합니다.
Customer 인스턴스는 CreditCard 인스턴스에 강한 참조를 가지고 있고, CreditCard 인스턴스는 customer에 대해 미소유 참조를 가지고 있습니다.
john변수에 의해 강한 참조를 끊을때 미소유 customer 참조 때문에 Customer 인스턴스에 대해 더이상 강한 참조를 가지지 않습니다.
john = nil
// Prints "John Appleseed is being deinitialized"
// Prints "Card #1234567890123456 is being deinitialized"
john에 nil을 설정하면 Customer과 CreditCard 인스턴스 모두 초기화 해제 됩니다.
(이해를 위한 덧붙임)
- 은행 고객 A가 신용카드 B를 가지고 있습니다.
Customer 클래스의 인스턴스 A가 생성됩니다.
CreditCard 클래스의 인스턴스 B가 생성됩니다.
A의 card 프로퍼티에 B를 할당합니다.
B의 customer 프로퍼티에 A를 할당합니다.
- 은행 고객 A가 신용카드 B를 해지 합니다.
A의 card 프로퍼티에서 B를 삭제합니다.
B의 customer 프로퍼티에서 A를 삭제합니다.
A의 인스턴스가 해제됩니다.
B의 인스턴스가 해제됩니다.
생각과 감정
한번 읽어서는 이해가 안되는 부분이 너무 많군요.. 미소유참조 약한참조 둘다 두번이상은 읽은것 같습니다...
이해가 빠릿빠릿 하게 되었으면 하네요..ㅠㅠ
조금씩 정진합시다 정진!
앞으로의 계획선언
내일부터는 졸업을 위한 OPIC공부와 정보처리기사 준비를 같이 해야할것 같네요!! 문서는 짬나거나 궁금한것이 있을때
다시한번 보는걸로 하고,,,, 앱개발 인강을 들으며 내실을 쌓아야 하겠습니다!!
'TIL' 카테고리의 다른 글
TIL_20231006 (0) | 2023.10.06 |
---|---|
TIL_20230921 (0) | 2023.09.21 |
TIL_20230914 (0) | 2023.09.14 |
TIL_20230913 (0) | 2023.09.13 |
TIL_20230912 (0) | 2023.09.12 |