옵저버 안전하게 제거하기
오래된 옵저버로 인한 누수와 충돌을 방지합니다.
옵저버 안전하게 제거하기은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
관찰자를 안전하게 제거하기
더 이상 필요하지 않은 관찰자는 제거해야 합니다. 남아 있는 관찰자는 소유 객체가 사라진 뒤에도 실행되어 버그를 일으킬 수 있으며, 예전 API에서는 앱을 중단시킬 수도 있습니다.
제거가 중요한 이유
셀렉터 기반 관찰자는 할당 해제된 객체에 메시지를 보내는 일을 방지하기 위해 전통적으로 deinit에서 제거해야 했습니다.
import Foundation
class Watcher: NSObject {
override init() { super.init() }
deinit { NotificationCenter.default.removeObserver(self) }
}
print("Removes itself on deinit")removeObserver(self)
removeObserver(self)를 호출하면 해당 객체가 등록한 모든 관찰을 한 번에 해제합니다.
import Foundation
class VM: NSObject {
func stop() { NotificationCenter.default.removeObserver(self) }
}
VM().stop()
print("Removed all observations for self")특정 이름 제거하기
이름과 객체를 전달하여 하나의 관찰만 제거하고 나머지는 유지할 수 있습니다.
import Foundation
let center = NotificationCenter.default
let obj = NSObject()
let name = Notification.Name("ping")
center.removeObserver(obj, name: name, object: nil)
print("Removed a specific observation")Token 기반 관찰자
클로저 기반 addObserver는 불투명한 token을 반환합니다. 이를 보관했다가 해당 token으로 관찰자를 제거하십시오.
import Foundation
let center = NotificationCenter.default
let name = Notification.Name("ping")
let token = center.addObserver(forName: name, object: nil, queue: nil) { _ in }
center.removeObserver(token)
print("Removed via token")Token 저장하기
관찰이 필요한 동안 token이 유지되도록 속성에 저장하고, 관찰이 끝나면 제거하십시오.
import Foundation
class Model {
var token: NSObjectProtocol?
func start() {
token = NotificationCenter.default.addObserver(
forName: Notification.Name("x"), object: nil, queue: nil) { _ in }
}
func stop() {
if let t = token { NotificationCenter.default.removeObserver(t) }
}
}
let m = Model(); m.start(); m.stop()
print("Lifecycle managed")deinit으로 자동 정리하기
소유 객체가 할당 해제될 때 관찰도 끝나도록 deinit에서 token을 제거하십시오.
import Foundation
class Owner {
var token: NSObjectProtocol?
deinit { if let t = token { NotificationCenter.default.removeObserver(t) } }
}
print("Token removed on deinit")최신 실행 환경에서의 수명 참고 사항
최근 실행 환경에서는 블록 API로 추가한 관찰자가 token의 할당 해제 시 자동으로 제거되지만, 명시적으로 제거하는 편이 여전히 안전하고 명확합니다.
import Foundation
// Holding the token in a property controls its lifetime.
class C { var token: NSObjectProtocol? }
print("Token lifetime equals observation lifetime")강한 참조 순환 방지하기
클로저 관찰자가 self를 강하게 캡처한다면, 할당 해제를 막는 강한 참조 순환을 피하기 위해 [weak self]를 사용하십시오.
import Foundation
class VM {
var token: NSObjectProtocol?
func start() {
token = NotificationCenter.default.addObserver(
forName: Notification.Name("x"), object: nil, queue: nil) { [weak self] _ in
self?.handle()
}
}
func handle() { print("handled") }
}
VM().start()두 번 제거해도 안전함
이미 사라진 관찰자를 제거해도 문제가 없으므로, 방어적으로 정리해도 앱이 중단되지 않습니다.
import Foundation
let center = NotificationCenter.default
let obj = NSObject()
center.removeObserver(obj)
center.removeObserver(obj) // no harm
print("Safe to remove twice")모범 사례 요약
Token 기반 클로저를 우선 사용하고, token을 저장한 다음 deinit에서 제거하며 self는 약하게 캡처하십시오. 이렇게 하면 관찰 수명을 올바르게 관리할 수 있습니다.
import Foundation
class Best {
var token: NSObjectProtocol?
deinit { token.map { NotificationCenter.default.removeObserver($0) } }
}
print("Followed best practices")빠른 확인
addObserver(forName:...)으로 추가한 클로저 기반 관찰자는 어떻게 제거하나요?
복습
더 이상 필요하지 않은 관찰자는 항상 제거하십시오. 셀렉터 관찰자에는 removeObserver(self)를 사용하고, 클로저 관찰자에는 반환된 token을 사용하십시오. token을 저장하고 deinit에서 정리하며 self는 약하게 캡처하십시오. 다음에는 관찰자 패턴을 다른 방법과 비교해 봅니다.
자주 묻는 질문
“옵저버 안전하게 제거하기” 강의는 무료인가요?
네 — “옵저버 안전하게 제거하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“옵저버 안전하게 제거하기”에서 뭘 배우나요?
오래된 옵저버로 인한 누수와 충돌을 방지합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Swift Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“옵저버 안전하게 제거하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 알림 게시와 관찰
- 알림 userInfo 페이로드
- 옵저버 안전하게 제거하기
- 옵저버 패턴의 대안