일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- MVVM
- 애니메이션
- Protocol
- tableView
- UITextView
- clean architecture
- swift documentation
- 리펙토링
- ios
- Xcode
- 스위프트
- UICollectionView
- Human interface guide
- uiscrollview
- RxCocoa
- HIG
- ribs
- collectionview
- 클린 코드
- Refactoring
- uitableview
- Clean Code
- Observable
- 리펙터링
- SWIFT
- 리팩토링
- map
- swiftUI
- combine
- rxswift
- Today
- Total
목록memory leak (6)
김종권의 iOS 앱 개발 알아가기
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dqvUVd/btstwfIRhIV/1IZsr15c4OOLEHbSFoQsLk/img.png)
일반적인 방법 - deinit에서 출력 deinit은 class타입에서 해당 인스턴스가 메모리 해제 될 때 호출되므로 이 부분을 출력되는것을 확인하여 쉽게 memory leak이 나고 있지 않다는 확인이 용이 // BaseViewController.swift deinit { print("DEINIT: \(self)") } 위처럼 구현하면 콘솔창을 일일이 확인해야하므로, 조금 더 편한 방법은 UIViewController가 메모리 해제될 때 소리로 알려주는 방법 메모리 해제될 때 소리로 알려주는 방법 특정 break point가 실행될 때 Xcode에서 소리가 나게끔하는 방법이 존재 특정 UIViewController를 닫을 때, 메모리 해제되는 타이밍에 소리가 나게끔 설정해놓고 만약 소리가 나지 않는다면..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/enGpwQ/btsd1ifUeMk/udTAvVkP53ZZkdhxIhx7b0/img.png)
UIStackView의 removeArrangedSubview 보통 UIStackView의 하위 뷰들을 제거할때 removeArrangedSubview를 통해 제거하는데, 이렇게만하면 memory leak이 발생 subviews에 접근하여 명시적으로 해당 뷰에서 removeFromSuperview()를 호출해줘야 제거가됨 ex) 메모리 릭 확인을 위해, 메모리에서 해제된경우 deinit에서 print문을 호출하는 뷰 정의 class MyView: UIView { init() { super.init(frame: .zero) backgroundColor = .yellow NSLayoutConstraint.activate([ heightAnchor.constraint(equalToConstant: 200), ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cprfdu/btrVZMZ8Vao/JZi6E4GdJ4qabPKQZMfElk/img.png)
Lazy var 클로저 사용시 주의사항 lazy var 클로저 사용 시 retain cycle이 발생하는지? 아래 1)번과 2)번 구분 (아래에서 계속) 1) private let text = "label" private lazy var label: () -> UILabel = { let label = UILabel() label.text = self.text // self를 안쓰면 컴파일에러 발생 label.translatesAutoresizingMaskIntoConstraints = false return label } 2) private let text = "label" private lazy var label: UILabel = { let label = UILabel() label.text = t..
1. 클로저를 사용할 때 주의할 점 - Memory Leaks, Retain Cycle, nested closure 첫 번째2. 클로저를 사용할 때 주의할 점 - nested closure 두 번째3. 클로저를 사용할 때 주의할 점 - nested closure 세 번째Memory Leak이란?메모리에 할당 되었지만, 절대 release되지 않고 reference되지 않는 것이것을 참조할 수 없기 때문에 절대 release할 수 없는 상태Retain Cycle이란?생성자가 할당 해제된 후에도 인스턴스가 할당 해제되지 않도록 하는 reference 상 순환을 이루는 상태둘 이상의 인스턴스가 서로에 대한 strong 참조를 보유할 때 발생retain cycle이 발생하지 않는 케이스UIView.animate..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/l8sgX/btrxVeTsM57/XG8Bj1CThfkMxymkamtZuK/img.png)
사전 지식1) capture와 escaping의 개념 공통점: 둘 다 closure에서 사용되는 개념 차이점 capture: 클로저 내부에서 밖에 있는 scope의 instance를 참조하는 것 escaping: 클로저 외부에서 해당 클로저 자체를 참조하고 있는 것 사전 지식2) Escaping closure의 의미 `저장`되고, `지연`시킬 수 있는 기능 블록을 가지는 클로저가 바깥의 변수에 의해서 저장되는 경우 "Escaping closure"라고 정의 인자로 전달받은 함수 중 함수의 리턴 이후에 실행될 수 있는 함수 함수가 리턴되면 해당 scope은 사라지지만, closure는 함수의 scope을 escaping하여 함수 종료 후에 실행된다는 의미 // 함수의 return보다 completion이 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bJHyan/btq9kQ1O2nd/q6cK1EKvlWrQRbmOGKKqRk/img.gif)
Memory Leak 메모리 누수는 인스턴스가 할당되었지만, 앱에서 더 이상 사용하지 않음에도 불구하고 해제되지 않은 메모리 블록이나 세션에 대한 참조가 없으면 해제할 방법이 없는 경우 존재 Instrumnets 도구 Xcode에 통합된 일련의 애플리케이션 성능 분석 도구 Allocation 상태를 확인 가능 Memory leak 상태 확인 가능 Instrument 사용하여 Memory Leak 분석 Instruments의 cmd + I로 'Profile' 실행 (I는 Instruments를 의미) 또는, Xcode > Run 아이콘 부분을 long 클릭 > Profile 선택 > Instruments 앱 자동 실행 > Leaks 선택 주의: "permission denied"오류 메시지 뜨는 경우, p..