Top Banner
16. Swift 튜튜튜튜 - 튜튜 튜튜 튜튜 (ARC) 튜 튜튜튜튜 튜튜튜튜 튜튜튜튜튜 튜튜튜튜튜튜튜 튜튜튜 2016. 2.
24

16 swift 자동참조계수,강한참조,약한참조

Apr 13, 2017

Download

Engineering

Donggyu Park
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 16 swift 자동참조계수,강한참조,약한참조

16. Swift 튜토리얼- 자동 참조 계수 (ARC) 와 강한참조 약한참조

창원대학교 정보통신공학과 박동규2016. 2.

Page 2: 16 swift 자동참조계수,강한참조,약한참조

메모리 관리Heap 영역 - 동적으로 메모리를 할당할때 위치하는 영역

Page 3: 16 swift 자동참조계수,강한참조,약한참조

메모리 관리Heap 영역

객체

Page 4: 16 swift 자동참조계수,강한참조,약한참조

메모리 관리Heap 영역

객체객체

객체

객체

Page 5: 16 swift 자동참조계수,강한참조,약한참조

메모리 관리Heap 영역

객체

Page 6: 16 swift 자동참조계수,강한참조,약한참조

메모리 관리Heap 영역

Page 7: 16 swift 자동참조계수,강한참조,약한참조

자동 참조 계수• Java - 가비지콜렉터를 사용함 , 메모리 관리는 편리하나 가비지콜렉터가 수시로 실행되어 시스템에 부하를 준다• C, C++ - 개발자가 할당한 동적메모리를 직접해제해야 한다 . 에러의 가능성이 높다• 자동참조 관리 기법

• 프로그램의 메모리 사용을 자동참조계수를 통해 추적하고 관리• 필요없는 클래스 인스턴스의 메모리를 자동적으로 해제• 클래스의 인스턴스에만 적용

Page 8: 16 swift 자동참조계수,강한참조,약한참조

ARC 작동원리 ARC 가Person 인스턴스메모리 유지 시작

참조 +1

참조 +2

참조 -1, Person 인스턴스의 참조가 모두 없어져 ARC 가 Person 인스턴스 메모리 할당 해제

참조 -2

Page 9: 16 swift 자동참조계수,강한참조,약한참조

강한 참조 순환예제 : 아파트 호수와사는 사람을 모델링

Page 10: 16 swift 자동참조계수,강한참조,약한참조

강한 참조 순환

Person 과 Apartment 가 1 개 이상의 참조가 생겨ARC 가 각각의 인스턴스를 메모리 유지 시작

Page 11: 16 swift 자동참조계수,강한참조,약한참조

강한 참조 순환

Person 인스턴스와 Apartment 인스턴스가서로를 강한 참조를 하게됨 .

Page 12: 16 swift 자동참조계수,강한참조,약한참조

강한 참조 순환

인스턴스를 참조하는 변수들을 해제시켜도인스턴스 간의 강한 참조 때문에 할당 해제가 되지 않음참조할 방법이 존재하지 않는 객체들이 해제되지 않고남아서 메모리를 차지함

Page 13: 16 swift 자동참조계수,강한참조,약한참조

해결

john!.apartment = nil 과 number73!.tenant = nil 을john = nil, number73.nil 앞에 추가하면 deinit 이 호출된너무 어렵네요 ????

Page 14: 16 swift 자동참조계수,강한참조,약한참조

강한 참조 순환 방지• 약한 참조

• 약한 참조는 인스턴스가 다른 인스턴스 참조를 할때 참조 카운터를 유지하지 않고 참조함

• 참조하던 인스턴스가 할당 해제되면 nil 을 할당- 반드시 옵셔널 타입의 변수로 선언해야 함

• 미소유 참조- 참조하는 인스턴스가 언제나 값을 가지고 있다고 간주- 반드시 인스턴스를 참조하는게 확실할 때만 사용

Page 15: 16 swift 자동참조계수,강한참조,약한참조

약한 참조

Page 16: 16 swift 자동참조계수,강한참조,약한참조

약한 참조

Apartment 인스턴스가 Person 인스턴스에 대해 약한 참조를 함

Page 17: 16 swift 자동참조계수,강한참조,약한참조

약한 참조 : weak

Page 18: 16 swift 자동참조계수,강한참조,약한참조

약한 참조의 결과

Page 19: 16 swift 자동참조계수,강한참조,약한참조

약한 참조

- john=nil 이 되면 Person 인스턴스에 대한 강한 참조가 없으므로 ARC 가 Person 인스턴스를 할당 해제시킨다- Apartment 인스턴스에 대한 강한 참조가 없어지므로 Apartment 인스턴스도 할당 해제된다

Page 20: 16 swift 자동참조계수,강한참조,약한참조

약한 참조• 러퍼런스를 가지고 동작하지만 인스턴스를 해제해야 할지 판단할때는 사용하지 않는다

• 즉 참조를 하되 강한참조가 없을 경우 인스턴스는 해제된다• 약한참조는 참조할 인스턴스가 존재하지 않을 가능성이 있으므로 항상 옵셔널 타입에 적용된다

Page 21: 16 swift 자동참조계수,강한참조,약한참조

unowned reference• 약한 참조는 참조할 인스턴스가 존재하지 않을 가능성이 있으므로 항상 옵셔널 타입에 적용된다• 옵셔널이 아닌 프로퍼티가 강한 참조를 가지지 않게 하려면 ?

• 프로퍼티가 nil 을 가지지 않는 것을 전제로하는 unowned reference 를 사용함

• unowned 키워드를 프로퍼티 앞에 사용

Page 22: 16 swift 자동참조계수,강한참조,약한참조

미소유 참조

Page 23: 16 swift 자동참조계수,강한참조,약한참조

미소유 참조• Team 클래스의 leader 프로퍼티가 미소유 참조임 • Team 클래스는 항상 leader 프로퍼티를 가져야 한다

( 옵셔널이 아님 )• 하지만 강한참조는 아니므로 참조 사이클이 생기지 않는다