[야우쓰] 2주차(3) ARC

hello_hidi·2022년 11월 22일
0

야우쓰

목록 보기
10/20
post-thumbnail

드디어 ARC이다!!!!

참조타입과 Heap

ARC를 제대로 배울라면 저번주차에서 다뤘던 참조타입과 메모리 구조에서 배운 Heap에 대한 이해가 있어야 된다!
간략하 설명하자면

  • Swift의 클래스와 클로저는 Heap영역에 저장되는 참조타입이다.
  • 참조타입의 특징은 지역변수는 단지 스택에 저장되어 인스턴스의 주소값을 가지고 있고
  • 스택의 지역변수가 힙 영역의 실제 인스턴스를 참조하는 형태이다.
    https://velog.velcdn.com/images/hello_hidi/post/1a733fa6-d646-45d5-a46f-f4b6f6447269/image.png

메모리 해제

우리는 지금까지 걍 마음대로 클래스 만들어서 인스턴스 퐉퐈고파ㅗ가퐈 찍어내고 마음껏 사용했음. but Heap에 특징! 사용하고 난 후 반드시 메모리 해제를 해줘야 한다! 근데 한 사람????

아무도 없을것이다! 왜냐? 바로 ARC가 해주기 때문이다!

ARC

Automatic Reference Counting의 약자로, 클래스 인스턴스가 더 이상 필요하지 않을 경우 메모리를 자동으로 해제해주는 것이 주기능이다!

ARC 작동원리

  1. ARC는 인스턴스에 대한 정보를 저장하기 위해 메모리의 청크에 할당합니다.
    • 메모리 청크: malloc()으로 할당 받는 영역과 header를 포함한 영역
  1. 컴파일 시점에 언제 참조되고 해제되는지 결정되어 retain, release를 삽입을 한다!
  2. 런타임 때 결정되어 그대로 실행한다

ARC에서 RC 다루기

i) RC값이 증가하는 경우

  • 인스턴스를 새로 생성할 때
  • 기존 인스턴스를 다른 변수에 대입할 때

ii) RC값이 감소하는 경우

  • 인스턴스를 가리키던 변수가 메모리에서 해제되었을 때
  • nil이 지정되었을 때
  • 변수에 다른 값을 대입한 경우
  • 프로퍼티의 경우, 속해있는 클래스 인스턴스가 메모리에서 해제될 때

예시 코드

class Ayomi {
    var name: String?
    var age: Int?
    
    init(name: String? = nil, age: Int? = nil) {
        self.name = name
        self.age = age
    }
    
    deinit {print("당신의 아요미 인생은 여기까지~")}
}


var hidi: Ayomi? = .init(name: "hidi", age: 23) // hidi Instance RC: 1
var hidiclone = hidi // hidi Instance RC: 2, hidiclone Instance RC: 2

hidiclone = nil // hidi Instance RC: 1
hidi = nil // hidi Instance RC: 0

var min: Ayomi? = .init(name: "min", age: 76) // min Instanc RC: 1
var minClone: Ayomi? = .init(name: "minClone", age: 5) // minClone Instance RC: 1

min = minClone // min Instance RC: 0, minClone Instance RC: 2


class Ayo {
    var level: Int?
    var ayomi: Ayomi? = .init(name: "ayomi", age: 20)
    
    init(level: Int? = nil) {
        self.level = level
    }
}

var ayo: Ayo? = .init(level: 31)
ayo = nil
profile
안뇽희디

0개의 댓글