메모리 구조 와 ARC

2023. 8. 30. 22:18iOS

메모리의 구조
Q. 컴퓨터의 주기억장치는 어떤어떤 영역을 가지고 있을까?


1. 스택 (Stack): 스택은 함수 호출과 관련된 정보를 저장하는 데 사용됩니다. 함수 호출 시에 호출 스택 프레임이 스택에 추가되고, 함수가 반환되면 해당 프레임이 스택에서 제거됩니다. 스택은 후입선출(LIFO) 방식으로 동작합니다.

2. 힙 (Heap): 힙은 동적으로 할당된 메모리를 저장하는 데 사용됩니다. 힙은 객체와 데이터 구조의 인스턴스, 그리고 동적으로 생성된 데이터를 저장하는 데 사용됩니다. 힙은 개발자가 메모리를 할당하고 해제하는 데 직접적인 제어를 갖습니다.

3. 데이터 영역 (Data Section): 데이터 섹션은 전역 변수와 정적 변수를 저장하는 데 사용됩니다. 프로그램 실행 전에 할당되고 프로그램 종료 시까지 유지됩니다.

4. BSS 영역: BSS(Block Started by Symbol) 섹션은 초기화되지 않은 전역 변수와 정적 변수를 저장하는 데 사용됩니다. BSS 섹션은 프로그램 실행 전에 할당되며, 0으로 초기화됩니다.

5. 코드 영역 (Code Section): 코드 섹션은 프로그램의 실행 가능한 명령어를 저장하는 데 사용됩니다. 코드 섹션은 읽기 전용이며, 실행 중에 수정되지 않습니다.

ARC


Q : ARC는 무엇인가?
자동으로 메모리를 관리하는 기술로, 객체에 대한 참조 카운트를 추적하여 메모리 할당과 해제를 자동으로 처리합니다. 이로인해 개발자가 수동으로 메모리 관리를 하지 않도록 해줍니다.

Q : ARC 이전의 메모리 관리는 어땠을까?
Objective-C에서는 개발자가 수동으로 메모리를 관리했습니다.
메모리 할당 및 해제에 대한 책임이 개발자에게 있었기 때문에, 메모리 관리 오류가 발생할 가능성이 있었습니다. 예를 들어, 메모리를 할당한 후에 해당 객체를 더 이상 사용하지 않는데 메모리를 해제하지 않는 경우 메모리 누수가 발생할 수 있습니다.

Q : ARC를 이해해야 하는 이유는 무엇무엇이 있을까?
1. 메모리 관리의 번거로움을 줄여줍니다. 객체의 참조 카운트를 자동으로 추적하고, 더이상 사용하지 않는 객체는 자동으로 메모리에서 해제시켜줍니다.

2. 메모리 누수와 관련된 문제를 방지 도와줍니다. ARC는 사용하지 않는 객체들을 메모리에서 제거함으로써 메모리 누수를 방지합니다.

Q : 언제 구조체를 선택하고 언제 클래스를 선택해야할까?
- 구조체를 사용할때
1. 단순한 데이터의 값을 보유할 때
2. 값 타입이 필요할 때
3. 불변성이 중요한 경우

- 클래스를 사용할때
1. objective-C 와 상호 운용성을 원할 때는 클래스를 사용한다.

2. 상속과 타입 캐스팅이 필요한 경우: 클래스는 상속을 지원하므로 기존 클래스를 확장하여 새로운 클래스를 정의할 수 있습니다. 또한, 클래스 인스턴스는 부모 클래스 타입으로 타입 캐스팅이 가능합니다.

3. 참조 타입이 필요한 경우: 클래스는 참조 타입이기 때문에 인스턴스를 전달할 때에는 참조가 전달됩니다.

다음과 같은 경우를 제외하고는 swift에서 구조체를 권장합니다. 
다른 프로그래밍 언어들과는 다르게 스위프트의 구조체는 클래스에서 사용할 수 있는 다양한 요소들을 사용할 수 있습니다.

- 다양한 요소: 연산/저장 프로퍼티, 메서드, 프로토콜 채택 등 다른 언어에서는 클래스에서만 사용할 수 있지만 스위프트에서는 구조체에서도 지원함









추가구성

 ARC는 무엇인가요?
 - ARC는 "Automatic Reference Counting"의 약자로, Swift에서의 메모리 관리 방식을 나타냅니다. ARC는 객체 또는 클래스 인스턴스에 대한 참조 횟수를 추적하고, 해당 객체를 더 이상 참조하지 않을 때 자동으로 메모리에서 해제하는 기능을 제공합니다. ARC는 Swift의 핵심 기능 중 하나로, 개발자가 수동으로 메모리 관리를 하지 않아도 되도록 해줍니다.

ARC 이전의 메모리 관리는 어땠나요?
-  ARC 이전의 Objective-C에서는 수동 메모리 관리 방식을 사용했습니다. 개발자는 메모리 할당과 해제를 직접 처리해야 했고, retain, release, autorelease와 같은 메모리 관리 메서드를 사용하여 객체의 참조 횟수를 추적하고 메모리를 해제해야 했습니다. 이러한 수동 메모리 관리 방식은 실수로 메모리를 누수시키거나, 이미 해제된 객체를 참조하는 등의 문제를 발생시킬 수 있었습니다.


ARC를 왜 이해해야할까요?
* 메모리 누수(순환 참조)를 막기 위해서
* 메모리를 효율적으로 쓰기 위해서
ARC는 어떻게 동작하나요?
* 클래스 인스턴스가 더 이상 필요하지 않을 때 메모리를 자동으로 해제합니다.
* 메모리의 참조 횟수(RC)를 계산하여, 참조 횟수가 0이 되면 더 이상 사용하지 않는 메모리라 생각하여 해제합니다.




4. 언제 구조체를 선택하고 언제 클래스를 선택해야할까요?
이럴 때 Struct를 쓰자
(1) 두 Object를 “같다, 다르다"로 비교해야하는 경우 (==, ≠)
let point1 = Point(x:3, y:4)
let point2 = Point(x:3, y:4)
SwiftCopy
(2) Copy된 각 객체들이 독립적인 상태를 가져야하는 경우
* 각 객체가 다른상태로 관리되어야 할때
var jasperMac = Mac(owner: "Jasper")
var katiMac = Mac(owner: "Kati")
SwiftCopy
(3) 코드에서 Object의 데이터를 여러 스레드에 걸쳐 사용할 경우
* value 타입의 경우, 해당 인스턴스가 copy된 unique한 인스턴스임
* 따라서 여러 쓰레드에 걸쳐 사용될 때 안전하다
* 한 객체에 여러 쓰레드가 동시에 접근했을 땐 잠재적인 위험이 있는데 value 타입을 쓰면 각 인스턴스가 unique해서 이러한 위험이 없음
(4) 그냥 디폴트로 Struct를 쓰자
* 다른 언어들과는 다르게 스위프트의 구조체는 클래스에서 사용할 수 있는 다양한 요소들을 사용할 수 있음
* 연산/저장 프로퍼티, 메서드, 프로토콜 채택 등 다른 언어에서는 클래스에서만 사용할 수 있지만 스위프트에서는 구조체에서도 지원함
* 또한 스위프트의 표준 라이브러리들의 데이터들 역시도 대부분 구조체를 사용해 구현되어 있음
이럴 때 Class를 쓰자
(1) 두 Object의 인스턴스 자체가 같음을 확인 해야할 때 (===)
* Object 내부의 Data가 같은지가 아님
* 객체 자체가 같은지
(2) 고유한 값을 제어해야 할 때는 클래스를 사용하세요.
* 클래스는 참조 타입이기 때문에 스위프트에서 고유한 값으로 사용됨
* 참조 타입을 사용하면 앱의 여러 곳에서 사용하더라도 한 영역에서 적용한 수정이 다른 영역에서도 적용됨
* 주로 파일 관리나 네트워크 연결과 같은 작업을 다룰 때 클래스를 사용
(3) Objective-C와 상호 이용(Interoperability) 해야 할 때
* Objective-C에서 지원하는 API를 사용해야 할 때는 Objective-C의 클래스를 상속받아 사용해야 할 수 있음
(4) 하나의 객체가 필요하고, 여러 대상에 의해 접근되고 변경이 필요한 경우
* shared and mutable state

'iOS' 카테고리의 다른 글

APPDelegate  (1) 2023.12.03
Cache  (0) 2023.08.30
SOLID  (0) 2023.08.22
노티피케이션이란 (Notification)?  (0) 2023.08.22
싱글톤 Singleton  (0) 2023.08.22