티스토리 뷰
ARC (Automatic Reference Counting)
자동으로 메모리 관리해주는 방식으로 필요하지 않는 클래스 인스턴스 를 참조 카운팅을 통해 관리 해주는 기법
더 이상 필요하지 않는 클래스 인스턴스를 메모리에서 해제해준다.
강한 참조
참조의 기본은 강한참조로 별도의 식별자를 명시하지 않으면 강한 참조이다.
class Person {
var name: String
var weight: Double
init(name: String, weight: Double) {
self.name = name
self.weight = weight
}
deinit {
print("\(name) 메모리 해제")
}
}
var kk: Person? = Person(name: "kk", weight: 60) // RC: 1
var mm: Person? = Person(name: "mm", weight: 70) // RC: 1
kk = nil // RC: 0
mm = nil // RC: 0
인스턴스 생성시 Reference Counting 은 하나씩 올라가고 nil 을 대입한 경우 메모리 해제가 되어 RC는 0 이 된다.
강한 참조 순환
인스턴스끼리 서로 참조하여 강한 참조 순환이 발생된다.
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
gildong?.pet = bori
bori = nil
gildong = nil
bori 와 gildong 이 강한 순환 참조가 되어 자동으로 메모리 해제가 되지 않아 메모리 누수가 발생이된다.
해결 방안으로 약한 참조와 비소유 참조 키워드를 선언하여 해결한다.
약한 참조
weak 키워드를 선언하여 인스턴스의 RC의 숫자를 올라가지 않게 한다.
자신이 참조하는 인스턴스가 메모리에서 해제되면 자동으로 nil 을 할당한다.
var 에서와 옵셔널인 경우만 사용이 가능하다.
class Dog {
var name: String
weak var owner: Person? // weak 키워드 ==> 약한 참조
init(name: String) {
self.name = name
}
deinit {
print("\(name) 메모리 해제")
}
}
class Person {
var name: String
weak var pet: Dog? // weak 키워드 ==> 약한 참조
init(name: String) {
self.name = name
}
deinit {
print("\(name) 메모리 해제")
}
}
var bori: Dog? = Dog(name: "보리")
var gildong: Person? = Person(name: "홍길동")
// 강한 참조 사이클이 일어나지 않음
bori?.owner = gildong
gildong?.pet = bori
// 메모리 해제가 잘됨(사실 이 경우 한쪽만 weak으로 선언해도 상관없음)
bori = nil
gildong = nil
미소유 참조
unowned 키워드를 사용하며 약한 참조와 다르게 자신이 참조하는 인스턴스가 메모리에서
해제되더라도 스스로 nil 할당해주지 않는다.
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
gildong?.pet = bori
// 메모리 해제가 잘됨(사실 이 경우 한쪽만 unowned로 선언해도 상관없음)
bori = nil
gildong = nil
Reference
https://velog.io/@kevinkim2586/%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8-ARC-Automatic-Reference-Counting
https://zeddios.tistory.com/1213
'IOS > swift' 카테고리의 다른 글
[Swift] GCD ( DispatchQueue) 정리 (0) | 2022.04.08 |
---|---|
[Swift] 클로저와 메모리 관리 (0) | 2022.04.06 |
[Swift] Method Dispatch 와 성능 최적화 (0) | 2022.04.05 |
[Swift] Optional (0) | 2022.03.22 |
[Swift] Codable (0) | 2022.03.22 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- ios
- flask
- docker
- 엘라스틱서치
- python
- WEB
- nginx
- 네트워크
- MYSQL
- SWIFT
- 도커
- 리눅스
- ElasticSearch
- SQL
- logstash
- BigData
- pytest
- network
- linux
- 로그
- spark
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함