🩵 오늘 한 일
✔️ AVPlayerViewControleller Memory Leak
AVPlayerViewController를 통해 받아온 영상 관련 데이터를 사용해서 화면에 보여주는 과제를 진행하고 있었다
1개의 에러..만 빼고 대충 완료된 것 같아서 Instruments를 돌려보았는데 이게 웬걸..
AVPlayerViewController.player.play() 했을 때 leak이 나는 것이다
시스템 라이브러리 leak이라서 그냥 냅둬야 하나.. 싶었는데 일단 튜터님께 여쭤보았음!
Reference Count에 의한 메모리 관리에서 leak이라는 것은 결국 강한 참조로 잡혀있기 때문에 계속 메모리에 남아있는 상황이 발생하는 것인데
비디오나 오디오와 같은 미디어 리소스는 백그라운드에 계속 살아 있어야 하는 상황이 있을 수도 있다.
(pip 모드로 사용한다던가, 음악 앱의 재생 상태라던가)
이러한 미디어 리소스들은 실행하는 것 자체로 메모리 점유율을 높게 가져가게 된다.
와중에 OS는 시스템의 메모리 사용량을 최소화하기 위해 늘 고군분투 중인데,
이것을 위해서 OS는 메모리 사용량이 높은 객체를 먼저 해제하는 정책을 가지고 있다
However!!!! 사용자 경험을 유지하기 위해 필수적으로 메모리 점유를 해야하는 상황이 있고
이럴 때 강한 참조를 사용하게 된다.
예를 들어, 사용자가 음악 앱을 사용하거나 비디오를 시청하는 동안, 해당 미디어 리소스는 계속해서 활성 상태여야 한다.
(어떻게 보면 사용자 입장에서는 굉장히 당연한 소리)
이런 경우, 해당 미디어 객체가 활성 상태로 유지되려면 메모리에서 해제되지 않아야 하고
강한 참조는 메모리에서 미디어 객체가 해제되지 않게 보장한다.
이것이 강한 참조를 사용하는 이유 중 하나이다.
내 나름대로 이해한 것을 정리해보았는데... 생각해보니 그렇다.
백그라운드 재생이 가능하려면 메모리를 먹어야 하고 그 메모리가 해제되면 안되니까 대안책으로 strong reference를 사용할 수 있는 것 아닌가?
세상에는 필요하기 때문에 냅둔 Leak도 있다는 것을 새삼 깨닫게 되었다...
✔️ 오토 레이아웃의 우선도
새로 팀이 된 곳에서 회고를 진행하던 중 stackView의 spacing이 우선도가 높을지, 오토레이아웃으로 자동 적용되는 spacing이 우선도가 높을지 궁금해하는 분이 계셨다
진짜 왜인지는 모르겠는데 나는 너무 당연하게 오토레이아웃이 먼저 적용되고 다른 건 무시되겠지.. 라고 생각하고 있었다.
(실제로 맞긴 함)
만약에 이런 코드가 있다면 어떻게 될까?
- 내부에는 spacing이 잡혀있고
- 오토 레이아웃으로 leadingAnchor, trailingAnchor가 전부 잡혀있는 상황
private func setUserActivity() {
let stackView = UIStackView()
stackView.axis = .horizontal
stackView.distribution = .fillEqually
stackView.spacing = 10
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.backgroundColor = .systemPink
[post, follower, following].forEach {
stackView.addArrangedSubview($0)
}
self.addSubview(stackView)
NSLayoutConstraint.activate([
stackView.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 15),
stackView.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -15),
stackView.topAnchor.constraint(equalTo: self.menuButton.bottomAnchor, constant: 41),
])
}
결론만 말하자면 spacing쪽이 무시된다.
leadingAnchor와 trailingAnchor를 둘 다 넣으면 스택뷰의 너비가 화면에 맞게 설정된다.
이런 경우, 스택뷰의 내부 여백은 spacing 옵션과 관계 없이 늘어나게 된다.
이것을 오토 레이아웃의 우선도가 높다고 할 수 있는건지.. 잘 모르겠당
leadingAnchor와 trailingAnchor는 크기 조절하는 거고 spacing은 여백을 조절하는 것이기 때문에
크기 옵션이 더 우선시 된다는 사실만 기억하면 될 것 같다.
팀 회고를 하다보면 이런 뭔가.. 당연하게 생각하고 있던 점을 다시 짚어볼 수 있어서 너무너무 좋은 것 같다.
재밌음ㅎㅎ
'TIL' 카테고리의 다른 글
[TIL] 24.02.02 (1) | 2024.02.02 |
---|---|
[TIL] 24.01.31 (0) | 2024.01.31 |
[WIL] 24.01.05 - 24.01.23 (1) | 2024.01.23 |
[TIL] 24.01.04 (0) | 2024.01.04 |
[TIL] 24.01.03 (1) | 2024.01.03 |