728x90
CFGetRetainCount
- Core Foundation Object의 reference count를 반환한다.
- memory leak이 있는 부분을 디버깅할 때 사용하면 유용하다.
예제
class Test {
deinit {
print("deinit \(CFGetRetainCount(self))")
}
var closure: (() -> Void)? = {
}
func doing() {
defer {
print("doing defer \(CFGetRetainCount(self))")
}
print("doing start \(CFGetRetainCount(self))")
closure = {
self
}
}
}
var test: Test? = Test()
print("init \(CFGetRetainCount(test))")
test = nil
/*
init 2
deinit 2
*/
- 인스턴스 생성 후 변수에 할당 후 출력하면 count가 2로 나온다.
- 정확한 이유를 찾진 못했는데 아마 CFGetRetainCount안에 argument로 들어가면서 참조가 하나 더 생겨서 2로 출력되는 걸로 추측된다.
- 따라서 deinit에서도 retain count는 2로 출력된다.
메모리 누수 디버깅하는 예제
class Test {
deinit {
print("deinit \(CFGetRetainCount(self))")
}
var closure: (() -> Void)? = {
}
func doing() {
defer {
print("doing defer \(CFGetRetainCount(self))")
}
print("doing start \(CFGetRetainCount(self))")
closure = {
self // weak self를 사용하지 않아, 강한 참조로 인해 count 1 증가
}
}
}
var test: Test? = Test()
print("init \(CFGetRetainCount(test))")
test?.doing()
print("before deinit \(CFGetRetainCount(test))")
test = nil //메모리 해제 시도
/*
init 2
doing start 3
doing defer 4
before deinit 3
*/
closure 프로퍼티에서 강한 참조로 self를 물고 있어서 doing메서드를 실행할 때 참조가 1 증가해서 deinit시에 참조수가 기본값인 2가 남아야 해제가 되지만 참조 수가 3이므로 해제가 되지 않는다.
class Test {
deinit {
print("deinit \(CFGetRetainCount(self))")
}
var closure: (() -> Void)? = {
}
func doing() {
defer {
print("doing defer \(CFGetRetainCount(self))")
}
print("doing start \(CFGetRetainCount(self))")
closure = { [weak self] in
self // weak self를 사용하여 참조 증가 x
}
}
}
var test: Test? = Test()
print("init \(CFGetRetainCount(test))")
test?.doing()
print("before deinit \(CFGetRetainCount(test))")
test = nil // 메모리 해제 시도
/*
init 2
doing start 3
doing defer 3
before deinit 2
deinit 2
*/
closure안에 weak self를 사용하자 정상적으로 메모리가 해제된다.
728x90
'iOS > 설명' 카테고리의 다른 글
[iOS] 앱 실행 시 UI Restoration Process (0) | 2022.06.06 |
---|---|
[iOS] App launch Sequence (0) | 2022.06.06 |
[iOS] Background Modes의 Location Updates (0) | 2022.05.30 |
[iOS] Xcode에서 Application state 확인하기 (0) | 2022.05.30 |
[iOS] Local Notification은 suspended에서 동작할까 (3) | 2022.05.30 |
댓글