일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Large File Storage
- Dispatch.main.sync
- 대머리깃허브
- windowScene
- swiftdocs
- Dependency Rule
- Automatically manage signing
- 로버트마틴형
- conflicting access to memory
- Git Large File Storage
- Concurrent
- UICoordinateSpace
- RxSwift
- iOS 버전 점유율
- iOS Target
- memory safety
- rib
- RxCocoa
- RIBs Tutorial
- in-out
- SWIFT
- Ribs
- ios
- coordinateSpace
- 잡초가득블로그
- 메모리 접근 충돌
- 클린아키텍쳐
- Apple Certificate
- Github file size
- App Signing
- Today
- Total
빙수왕의 개발일지
Swift Memory Allocation 본문
2가지 allocation이 있다.
static, dynamic
두개의 차이? static은 메모리 할당이 컴파일 시점에, dynamic은 런타임에 일어난다는 것이다.
Swift에서 이건 값 타입(static allocation)이냐, 레퍼런스 타입(dynamic allocation)이냐로 결정이 된다.
이에 관한 외국 형님의 포스팅
https://medium.com/@Yerazhas/static-dynamic-things-in-swift-part-1-f53fae89ef38
음.. 그리고 이건 메모리 찾아보다보니까 본건데 C 기준이라 Swift랑은 다른 것 같다.
https://www.geeksforgeeks.org/difference-between-static-and-dynamic-memory-allocation-in-c/
+ 아.. 그리고 String을 많이 쓰면 안좋다고 한다.
이유는 힙을 많이 쓰기 때문인데, String은 값타입인데 왜 힙을 쓰냐?
값타입이지만 스택에 할당되어 가지고 있는 값은 주소값이고 사실 그 내용(Content)에 해당하는 녀석들은 힙에 할당되기 때문이다. (근데이건 모른다고 함.. 스택에 할당되는 경우도 있다고 한데..)
이건 배열도 마찬가지일듯.
+ 오 그리고 레퍼런스 타입은 사실 스택도 사용한다. 주소값은 스택에, 실제 값은 힙에 할당..
+ static let shared = ImageCache()
어떻게 할당이 될까? (ImageCache는 class이다)
(저만의 뇌피셜이고 hoxy 지나가다가 답을 아는분 있으면 댓글좀 부탁드려요)
shared는 일단 static이므로 lazy하다. (static은 무조건 lazy하다! 처음 안 사실..!) 근데 또 lazy는 init기준이니까 allocation이랑은 상관없는듯..
암튼 다시 돌아가서.. 레퍼런스형이니까
만약 let shared = ImageCache() 이라면 -> shared는 컴파일시점에 스택에 주소값을 가질 방이 할당되고.. 런타임에 ImageCache()가 힙에 할당될 것이다.
근데 static이 있다. static 변수는 일반 변수와 달리 Data 영역에 저장된다고 하는데 ..
그럼 위에서 힙 부분을 Data가 대신하는것인가..????
스택에 주소값을 가지고 얘가 가리키는 곳이 Data영역의 ImageCache() 인가...????
그럼.. 레퍼런스형이지만 static하면 힙이 아니고 Data영역에 할당되는 것인가. 언제??? 컴파일시점에?
Data영역의 애들은 프로그램의 시작에 할당되고 종료에 해제된다고 한다.
그러면 내 생각에 결론은
스택 영역에 컴파일 시점에 주소를 담을 방을 가지고 있고,
프로그램이 시작되면 ImageCache()를 Data 영역에 할당한다.
그리고 프로그램이 종료되면 Data영역의 메모리가 해제된다.
아니 그러면 lazy init은 그저 stack에서 data로 화살표를 가리키는 행동을 의미하는가.. ? 모르겠다.
머리가 아프니까 나중에 좀더 고민해보기로........
+ 다 읽어보진 않았지만.. 또 까먹을거같으니 적어놔야겠다.
Understanding Swift Performance - WWDC 2016
이거 번역한 포스팅을 보는게 이해에 많은 도움이 되었다. 이분들은 그저 빛...
https://corykim0829.github.io/swift/Understanding-Swift-Performance/#
https://zeddios.tistory.com/596
'개발 > iOS' 카테고리의 다른 글
switch 사용하지 않고 if로 Result 타입 캐스팅하기 (0) | 2021.06.16 |
---|---|
IBOutlet 뷰를 연결했는데도 nil 오류가 날 때 (0) | 2021.05.22 |
autolayout 제약오류 시 체크할 것 (0) | 2021.05.18 |
주석 다는법 (0) | 2021.05.07 |
tabBarItem.value(forkey: "view")가 nil일 때 (0) | 2021.04.17 |