Câu trả lời chung chung sẽ là "ngay khi bạn không cần thông báo nữa". Đây rõ ràng không phải là một câu trả lời thỏa mãn.
Tôi khuyên bạn nên thêm một cuộc gọi [notificationCenter removeObserver: self]
trong phương thức dealloc
của các lớp đó, mà bạn định sử dụng làm người quan sát, vì đây là cơ hội cuối cùng để hủy đăng ký một người quan sát một cách sạch sẽ. Tuy nhiên, điều này sẽ chỉ bảo vệ bạn khỏi sự cố do trung tâm thông báo thông báo các đối tượng đã chết. Nó không thể bảo vệ mã của bạn khỏi việc nhận thông báo, khi các đối tượng của bạn chưa / không còn ở trạng thái mà chúng có thể xử lý thông báo đúng cách. Đối với điều này ... Xem ở trên.
Chỉnh sửa (vì câu trả lời dường như thu hút nhiều nhận xét hơn tôi nghĩ) Tất cả những gì tôi muốn nói ở đây là: thật khó để đưa ra lời khuyên chung về thời điểm tốt nhất nên xóa người quan sát khỏi trung tâm thông báo, bởi vì điều đó phụ thuộc:
- Về trường hợp sử dụng của bạn (Những thông báo nào được quan sát thấy? Khi nào chúng được gửi?)
- Việc thực hiện của người quan sát (Khi nào nó sẵn sàng nhận thông báo? Khi nào nó không còn sẵn sàng?)
- Thời gian tồn tại dự định của người quan sát (Nó có bị ràng buộc với một số đối tượng khác, chẳng hạn như một khung nhìn hay bộ điều khiển khung nhìn?)
- ...
Vì vậy, lời khuyên chung tốt nhất mà tôi có thể đưa ra: để bảo vệ ứng dụng của bạn. chống lại ít nhất một thất bại có thể xảy ra, hãy removeObserver:
nhảy vào dealloc
, vì đó là điểm cuối cùng (trong vòng đời của đối tượng), nơi bạn có thể làm điều đó một cách sạch sẽ. Điều này không có nghĩa là: "chỉ cần trì hoãn việc loại bỏ cho đến khi dealloc
được gọi, và mọi thứ sẽ ổn". Thay vào đó, hãy loại bỏ người quan sát ngay khi đối tượng không còn sẵn sàng (hoặc được yêu cầu) để nhận thông báo . Đó là thời điểm chính xác. Thật không may, không biết câu trả lời cho bất kỳ câu hỏi nào được đề cập ở trên, tôi thậm chí không thể đoán được thời điểm đó sẽ là khi nào.
Bạn luôn có thể an toàn removeObserver:
một đối tượng nhiều lần (và tất cả, trừ lần gọi đầu tiên với một người quan sát nhất định sẽ là nops). Vì vậy: hãy nghĩ đến việc làm lại (một lần nữa) dealloc
để chắc chắn, nhưng trước hết: hãy làm nó vào thời điểm thích hợp (được xác định bởi trường hợp sử dụng của bạn).