티스토리 뷰
[Swift/iOS] 메모리 안전성 Memory Safety From 공식문서(1)
[Swift/iOS] 메모리 안전성 Memory Safety From 공식문서(2)
! 공식문서를 참고한 글입니다.
메모리에 접근할 때, 충돌을 피하는 코드를 구조화 하는 법
기본적으로 스위프트는 코드에서 일어나는 UnSafe한 행동을 방지합니다.
예를 들어,
스위프트는 변수를 사용 전에 초기화시키는 것, 메모리는 해제 된 뒤에 접근할 수 없는 것, 배열 인덱스가 범위를 벗어났는지 체크하는 것
등을 보장합니다.
대부분의 경우에는 스위프트가 메모리를 자동으로 관리하기 때문에 이를 생각할 필요는 없지만,
충돌이 발생할 수 있는 경우를 알고, 그것을 예방하는 코드를 작성할 줄 알아야 합니다.
충돌이 일어난 경우에는 컴파일 오류나 런타임 오류가 발생할 수 있기 때문입니다.
메모리 접근 충돌의 이해
Understanding Conflicting Access To Memory
변수에 값을 설정하거나 함수에 전달인자를 전달할 때 메모리의 접근이 발생합니다.
var one = 1 // one이 저장된 메모리에 대한 쓰기 접근
print("We're number \(one)!") // one이 저장된 메모리에 대한 읽기 접근
다른 부분들의 코드가 '동시에 같은 메모리에 접근하는 것'은 메모리 접근 충돌을 일으킬 수 있습니다.
동시성, 멀티 스레드 코드에서 메모리 충돌 액세스를 경험할 수 있습니다.
단일 스레드에서도 발생할 수 있습니다.
단일 스레드에서 메모리 접근 충돌이 일어난 경우에는 컴파일 오류나 런타임 오류가 발생합니다.
메모리 접근의 특징
Characteristics of Memory Access
접근 충돌의 내용을 이해하기 위한 메모리 접근의 3가지 특징을 살펴보겠습니다.
1. 접근의 읽기인지 쓰기 여부,
2. 접근의 지속 시간
3. 접근되고 있는 메모리의 위치
다음 조건에서 두가지를 갖는다면 충돌이 발생합니다.
- 적어도 하나는 쓰기 접근이거나 nonatomic 접근이다.
- 메모리의 동일한 위치에 접근한다.
- 지속시간이 겹친다.
Inout 파라미터의 접근 충돌
Confilcting Access to In-Out Parameters
var stepSize = 1
func increment(_ number: inout Int) {
number += stepSize
}
increment(&stepSize)
// Error: conflicting accesses to stepSize
- 함수를 실행할 때, stepSize를 전달인자로 받습니다.
- inout 파라미터는 인자에 대한 장기간 long-term 쓰기 접근을 갖게 됩니다.
- number(stepSize)에 장기 쓰기 접근을 시작합니다.
- 함수 내부의 stepSize에 대한 읽기 접근 시도합니다.
- 읽기와 쓰기 액세스는 같은 메모리를 참조하며, 충돌이 발생합니다.
해결방법
var copyOfStepSize = stepSize // 명시적인 복사본 만들기
increment(©OfStepSize)
stepSize = copyOfStepSize // 원본 업데이트
동일한 값을 여러 inout 파라미터로 사용할 수 없습니다.
var realName = "철수"
func printName(name: inout String, secondName: inout String) {
name = "가짜 이름은 영수"
secondName = "두번째 이름도 영수"
print(name)
print(secondName)
}
printName(name: &realName, secondName: &realName)
// 에러 발생 Inout arguments are not allowed to alias each other
// Overlapping accesses to 'realName', but modification requires exclusive access; consider copying to a local variable
같은 메모리 위치에 두 개의 쓰기 액세스를 동시에 수행하기 때문에 충돌이 발생합니다.
'programming > Swift' 카테고리의 다른 글
[Swift/iOS/디자인패턴] 퍼사드 Facade 패턴 (0) | 2023.05.03 |
---|---|
[Swift/iOS/디자인 패턴] Delegate 패턴 (0) | 2023.05.02 |
[Swift/iOS] In-Out Parameters From 공식문서 (0) | 2023.04.27 |
[Swift/iOS] 캡쳐리스트 Capture List , 탈출 클로저 escaping Closure, 자동클로저 AutoClosure from 공식문서 (0) | 2023.04.27 |
[Swift/iOS] 자동 참조 카운트 ARC(Automatic Reference Counting) from 공식문서 (0) | 2023.04.27 |
- Total
- Today
- Yesterday
- object
- ASAuthorizationAppleIDCredential
- Core Data Stack
- autoclosure
- authorizationCode
- ios
- 메모리 안정성
- 자동클로저
- core data
- escaping closrue
- Delegate 패턴
- identity Token
- 클로저 축약
- 강한참조순환
- 클로저
- unowned
- 클로저 강한 참조
- 강한 참조 순환
- 클로저표현
- 디자인패턴
- 토큰저장
- 회원가입
- CoreData
- context
- Entity
- inout 파라미터 메모리 충돌
- 캡쳐리스트
- SWIFT
- weak
- Persistent Container
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |