티스토리 뷰
Auto Reference Counting
( a.k.a ARC )
참고 자료
Swift 4.2 - The Swift Programming Language (Apple Inc.)
야곰의 스위프트 프로그래밍
1) ARC ?
Swift 는 앱 내에서 메모리 사용을 관리(manage), 추적(track)하기 위해서 ARC 라는 것을 사용한다.
대부분의 경우에 이는 Swift 에서 메모리 관리가 '단지 작동한다는 것(just works)',
쉽게 말하자면 메모리 관리에 대해서 우리가 생각할 필요가 없다는 것이다.
왜냐하면 ARC는 자동적으로 어떤 클래스의 인스턴스(instance)가 더 이상 필요하지 않을 떄,
이 클래스의 인스턴스에 의해서 사용된 메모리를 (ARC 가 알아서) 해제하기 때문이다.
그러나, ARC의 이러한 장점에도 불구하고 메모리 관리를 위해 우리가 (작성한) 코드들 사이의 관계에 대해 더 많은 정보를 필요로 하는 약간의 케이스가 존재한다.
(* 약간의 케이스 : 강한 순환 참조와 같은 문제)
참조 카운트(Reference counting)는 오직 클래스의 인스턴스에만 적용된다.
구조체와 열거형은 참조 타입이 아닌(not reference types), 값 타입(value types) 이고 참조에 의해(by reference) 처리되지도, 할당도 되지 않는다.
* 요약
- WWDC 2011 에서 발표되었으며, RC(Reference Counting) 자동 관리 방식을 말한다.
- 컴파일러가 개발자를 대신해 메모리 관리 코드를 적잘한 위치에 자동으로 삽입한다.
- 메모리 관리 이슈를 줄이고 개발자가 코딩 자체에 집중할 수 있게 하는 장점이 있다.
( Benefit of ARC )
출처 : http://blog.jaredsinclair.com/post/98402624705/beyond-objective-c-beyond-swift
- ARC 는 클래스의 인스턴스에만 적용된다.
* Class 의 경우 Reference Type 인 반면, Struct 와 Enum 은 Value Type 이기 때문.
- 활성화된 참조카운트가 하나라도 있으면 메모리에서 해제되지 않는다.
- 참조 타입
# 강한 참조(Strong) : 기본값. Weak 의 경우 명시해주지만 강한 참조의 경우 기본값이기 때문에 우리가 따로 표시를 하지 않았지만 지금까지 잘 사용해왔다.
# 약한 참조(Weak), 미소유 참조(Unowned) : 참조 카운트를 증가시키지 않는다.
# 강한 순환 참조 (Strong Reference Cycles) 에 대한 주의 !!
2) ARC는 어떻게 작동할까 ?
새로운 클래스의 인스턴스를 만들어 낼 때마다, ARC 는 메모리 공간의 한 부분을 인스턴스에 대한 정보를 저장하기위해 할당(allocates)한다.
이 메모리 공간은 인스턴스의 타입에 대한 정보와 그 인스턴스와 연관된 모든 저장 프로퍼티의 값들에 대한 정보를 가지고(holds) 있다.
추가적으로, 한 인스턴스가 더 이상 필요치 않을 때, ARC는 그 인스턴스에 의해서 사용된 메모리를 할당 해제(frees up)시킨다.
그래서 그 메모리는 대신 다른 목적을 위해 사용이 가능해질 수 있다.
이것은 클래스 인스턴스가 더 이상 필요하지 않을 때 메모리 상의 공간을 차지하지 않는다는 것을 보장한다.
그러나, 만약 ARC가 여전히 사용중인 상태에 있었던 어떤 인스턴스를 할당 해제한다면,
그것은 더 이상 인스턴스의 프로퍼티들에 접근할 수가 없게 되는 것 혹은 인스턴스 메소드를 호출할 수 없게 되는 것을 뜻한다.
실제로, 만약 여러분이 이 인스턴스에 접근하려고 시도 한다면, 여러분의 앱에서 아마도 가장 가능성이 있는 결과는 충돌(Crush)일 것이다.
인스턴스가 계속해서 필요한 동안에는 이 인스턴스를 확실히 사라지지 않게 하기 위해서, ARC 는 얼마나 많은 프로퍼티, 변수, 상수들이 현재 각각의 클래스 인스턴스에 대해 참조하고 있는지를 추적한다. ARC 는 여전히 존재하고 있는 인스턴스에 대해 적어도 하나의 활성화된 참조(active reference) 가 있다면은 인스턴스를 할당 해제하지 않을 것이다.
이것을 가능하게 하기 위해서 클래스의 인스턴스를 변수던 상수던 프로퍼티에 할당할때마다, 그 프로퍼티는 변수던 상수던 그 인스턴스에 강한 참조(strong reference)를 만들어낸다. 이러한 참조를 "강한(Strong)" 참조라 일컫는다. 왜냐하면 이 강한참조라고 불리는 것이 인스턴스를 계속해서 확고히 붙들고 있기 때문이며, 또한 강한 참조가 남아있는 한 인스턴스가 할당 해제(be deallocated)되도록 허락하지 않기 때문이다.
( * 참고 : 우리가 평소에 아무렇지 않게 사용했던 것은 기본값이 강한참조로 되어 있어 생략이 가능했기 때문이다. )
3) ARC 실행
- 활성화된 참조카운트가 하나라도 있으면 메모리에서 해제되지 않는다.
Here’s an example of how Automatic Reference Counting works.
This example starts with a simple class called Person
, which defines a stored constant property called name
:
어떻게 ARC가 작동하는지의 하나의 예를 보자.
이 예시는 Person 이라 불리는 단순한 하나의 클래스이며, 이 클래스에는 name 이라 불리는 저장 상수 프로퍼티가 정의된 것으로 시작한다.
class Person {
let name: String
init(name: String) {
self.name = name
print("\(name) is being initialized")
}
deinit {
print("\(name) is being deinitialized")
}
}
The Person
class has an initializer that sets the instance’s name
property and prints a message to indicate that initialization is underway.
The Person
class also has a deinitializer that prints a message when an instance of the class is deallocated.
Person 클래스는 인스턴스의 name 프로퍼티를 설정하고 초기화가 진행 중임을 나타내는 한 메시지를 프린트 하는 이니셜라이져를 가지고 있다.
Person 클래스는 또한 디이니셜라이저를 가지는데, 클래스의 인스턴스가 할당 해제되었을 때 작성된 대로 메세지를 프린트한다.
The next code snippet defines three variables of type Person?
, which are used to set up multiple references to a new Person
instance in subsequent code snippets. Because these variables are of an optional type (Person?
, not Person
), they are automatically initialized with a value of nil
, and do not currently reference a Person
instance.
아래의 코드 스니펫은 3개의 Person? 타입의 변수들을 정의하고 있다. 이 변수들은 다음의 코드 스니펫들 내의 새 Person 인스턴스에 대한 다수의 참조를 설정하기 위해 사용된다. 3개의 변수들은 옵셔널 타입이기 때문에 (Person 이 아니라 Person? 으로 되어있음에 주의 !), 이 변수들은 자동으로 nil 값으로 초기화 되고, Person 인스턴스를 현재에는 참조하고 있지 않다.
var reference1: Person?
var reference2: Person?
var reference3: Person?
You can now create a new Person
instance and assign it to one of these three variables:
이제 새 Person 인스턴스를 만들 수 있고 거기에 이 3개의 변수들 중 하나를 할당할 수 있다:
reference1 = Person(name: "John Appleseed")
// Prints "John Appleseed is being initialized
Note that the message "John Appleseed is being initialized" is printed at the point that you call the Person class's initializer.
This confirms that initialization has taken place.
Person 클래스의 이니셜라이저를 호출하려는 참에, 메시지 "John Appleseed is being initialized" 가 프린트 되는 것에 주목해주세요.
이것을 통해 우리는 초기화가 일어났음을 확인할 수 있습니다.
Because the new Person instance has been assigned to the reference1 variable, there is now a strong reference from reference1 to the new Person
instance. Because there is at least on strong reference, ARC makes sure that this Person is kept in memory and is not deallocated.
새 Person 인스턴스가 reference1 변수에 할당되었으므로, 이제 reference1 에서 새 Person 인스턴스로의 강력한 참조가 존재합니다.
적어도 강한 참조가 있기 때문에, ARC는 이 Person 인스턴스가 메모리에 유지되고 할당 해제 되지 않는다는 것을 확실하게 합니다.
If you assign the same Person
instance to two more variables, two more strong references to that instance are established:
reference2 = reference1
reference3 = reference1
Person
instance.nil
to two of the variables, a single strong reference remains, and the Person
instance is not deallocated:reference1 = nil
reference2 = nil
Person
instance until the third and final strong reference is broken, at which point it’s clear that you are no longer using the Person
instance:reference3 = nil
// Prints "John Appleseed is being deinitialized"
이어서... ARC (2) 에서는
4) 클래스 인스턴스들 사이의 강한 순환 참조 부터 다뤄보도록 하겠습니다.
번역의 오역에 대한 지적 감사드리겠습니다 !
'Programming > Swift' 카테고리의 다른 글
1. Swift : ARC(Auto Reference Counting) (3) (0) | 2018.09.22 |
---|---|
1. Swift : ARC(Auto Reference Counting) (2) (0) | 2018.09.19 |
1. Swift : JSON (0) | 2018.07.22 |
1. Swift : 집단 자료형(Collection Type) - 딕셔너리(Dictionary) (0) | 2018.06.24 |
1. Swift : 집단 자료형(Collection Type) - 집합(Set) (0) | 2018.06.17 |
- Total
- Today
- Yesterday
- Swift
- 열거형
- 타입
- 스위프트
- commit
- ios
- swiftUI
- Operator
- inswag
- iOS개발스쿨
- lifecycle
- 컨버전
- array
- 패캠
- OOP
- function
- 깃허브
- 리터럴
- 튜플
- 개발스쿨
- fastcampus
- 프로그래밍
- tca
- Dictionary
- GCD
- 딕셔너리
- 패스트캠퍼스
- ARC
- fallthrough
- var
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |