본문은 야곰 아카데미 커리어 스타터 캠프를 통해 학습한 내용을 회고한 글입니다.
메모리의 구조
주기억장치
현재 CPU가 처리하고 있는 내용을 저장하고 있는 기억장치
비교적 용량이 크고 처리 속도가 빠름
데이터를 읽는 속도가 보조기억장치에 비해 상대적으로 빠름: ROM(기억된 정보만을 읽음)과 RAM(휘발성 메모리)로 이루어져있기 때문
CPU의 명령에 의해 기억된 장소에 직접 접근하여 읽고 쓸 수가 있음
ROM(Read Only Memory) | RAM(Random Access Memory) |
▪️ 비휘발성 메모리: 전원이 끊어져도 기록된 데이터들이 소멸되지 않음 ▪️ 오직 데이터를 읽기만 가능한 장치 ▪️ 데이터 저장 후 수정 불가능 ▪️ 데이터를 저장 후 반영구적으로 사용 가능 ▪️ 시스템에 기억시키고 변화시키면 안 되는 BIOS(Basic Input/Output System)와 같은 주요 데이터 저장 |
▪️ 휘발성 메모리: 전원이 끊어지면 데이터가 전부 지워짐 ▪️ 데이터를 읽고 쓰기 모두 가능 ▪️ 응용 프로그램, 운영체제 등을 불러와 CPU가 작업할 수 있도록하는 기억장치 ▪️ 데이터를 읽는 속도와 기록하는 속도가 같고 프로그램을 로딩하거나, 데이터를 임시 저장하는 곳에 사용 ▪️ 실행하고 있는 파일을 항상 보조기억장치에 저장해줘야함 |
코드, 데이터, 힙, 스택
코드(Code) | 데이터(Data) |
|
|
스택(Stack) | 힙(Heap) |
|
|
오버플로우
한정된 메모리 공간이 부족하여 메모리 안에 있는 데이터가 넘쳐 흐르는 현상
- 힙 오버플로우: 힙이 스택을 침범하는 경우
- 스택 오버플로우: 스택이 힙을 침범하는 경우
String, Array, Dictionary 타입은 힙(Heap) 할당
sequence 타입은 크기가 저장되어있지 않아 동적이므로 힙에 할당
컴파일&런타임
컴파일 에러 | 런타임 에러 |
|
|
ARC
ARC란
앱의 메모리 사용을 관리하기 위해 사용하는 것
- 자동으로 참조 횟수를 관리: 메모리 관리에 신경 쓸 필요가 없음
- 사용하지 않는 인스턴스는 메모리에서 자동으로 할당 해제
- 만약 ARC가 할당 해제한 인스턴스에 접근하는 경우 반드시 충돌 발생
- 인스턴스 생성시, 참조의 기본 형태는 Strong reference: 사용 중인 인스턴스가 할당 해제 되지 않도록 유지하기 위함
- 아직 사용중인 인스턴스를 할당 해제하지 않기 위해서 얼마나 많은 프로퍼티, 상수, 혹은 변수가 그 인스턴스에 대한 참조를 가지고 있는지 추적
- 최소 하나라도 그 인스턴스에 대한 참조가 있는 경우 그 인스턴스를 메모리에서 할당 해제하지 않음
- cf. 참조 횟수는 클래스 타입의 인스턴스에만 적용되고 값 타입인 구조체나 열거형 등에는 적용되지 않음
ARC 이전의 메모리 관리
MRC(Manual Reference Counting)사용
- 개발자가 직접 메모리 관리 코드를 작성함
- 프로그램의 안정성 낮아짐: 상대적으로 코드 길이가 길어지고, 휴먼 에러 가능성이 높아짐
- 개발자가 직접 Count 관리를 하기 때문에 인스턴스에 대한 RC에 접근 가능한 프로퍼티가 존재(retainCount)
- 인스턴스의 기본 메서드인 retain과 release를 사용
- 처음 인스턴스 생성시 자동으로 retain count가 1이 됨
- 인스턴스 참조가 발생시, retain 함수 호출을 통하여 retain count에 += 1을 함
- 인스턴스 참조를 해제할 시, release 함수 호출을 통하여 retain count에 -= 1을 함
- 클래스 인스턴스에 nil을 넣어줘도 retain count가 -1 되지 않는다: 꼭 release 함수 호출하여 retain count를 사용하여 -1 해야함
- 클래스 인스턴스의 retain count가 0이 되면 메모리에서 완전히 제거
- ARC로 메모리 관리 방법이 바뀌면서 컴파일 타임에 컴파일러가 코드를 분석하여 MRC를 사용할 때 작성하던 메모리 관리 코드를 적절한 부분에 삽입하여 자동으로 관리할 수 있게
'YAGOM CAREER STARTER' 카테고리의 다른 글
[TIL] 20230220: JSON (0) | 2023.02.21 |
---|---|
[TIL] 20230207: Decimal, Closures (0) | 2023.02.08 |
[토요스터디A반] 20230204: 고차함수 (0) | 2023.02.06 |
[TIL] 20230131: - (0) | 2023.02.06 |
[TIL] 20230130: foreach, compactMap (0) | 2023.01.31 |