Có rất nhiều cuộc thảo luận về việc xóa thông báo theo đúng cách. Ví dụ:
tôi khuyên bạn nên tháo các nhà quan sát trong viewWillDisappear
(hoặc viewDidDisappear
) và viewDidUnload
phương pháp vòng đời. (Lưu ý:viewDidUnload
được chấp nhận và không nên được thực hiện trong iOS6 +, xem iOS 6 - viewDidUnload migrate to didReceiveMemoryWarning?)
Một lưu ý quan trọng:
viewDidUnload
không được đảm bảo để được gọi là - nó không phải là một phương pháp vòng đời tiêu chuẩn.
Từ Apple doc:
viewDidUnload Khi một tình trạng bộ nhớ thấp xảy ra và quan điểm quan điểm điều chỉnh dòng điện của không cần thiết, hệ thống có thể lựa chọn để loại bỏ những quan điểm từ bộ nhớ . Phương pháp này được gọi sau khi chế độ xem của trình điều khiển chế độ xem có được phát hành và là cơ hội để bạn thực hiện bất kỳ lần dọn dẹp cuối cùng nào.
Thay vào đó, dealloc
được gọi bất cứ khi nào số tham chiếu cho người nhận đó bằng không.
Hy vọng điều đó sẽ hữu ích.
Sửa
Vì lợi ích của sự hoàn chỉnh, bạn có thể nhìn thấy liên kết này về cách avoid-nsnotification-removeobserver. Liên kết cung cấp một số hướng dẫn hữu ích để xóa người quan sát (xem thêm các nhận xét). Tác giả thực hiện nó trong các phương thức viewDidAppear
/viewDidDisappear
kể từ viewWillAppear
và viewWillDisappear
không phải lúc nào cũng được gọi chính xác trong nhiều ứng dụng. Đó là sự lựa chọn của bạn.
Nếu bạn muốn đảm bảo xóa người quan sát theo đúng cách, hãy hủy đăng ký phương thức đó theo phương pháp dealloc
hoặc khi chế độ xem được tải hoàn toàn như bạn đã viết trong nhận xét thứ hai. Nhưng hãy chắc chắn rằng dealloc
sẽ được gọi trong tương lai. Nói cách khác, như tôi đã đề cập, nếu bộ điều khiển tiếp tục sống động vì một số đối tượng khác có tham chiếu đến nó, phương thức sẽ không bao giờ được gọi. Trong trường hợp này bộ điều khiển tiếp tục nhận được thông báo.
Nguồn
2012-04-26 13:45:50
Tôi không nghĩ rằng việc xóa người quan sát không tồn tại có bất kỳ tác động bất lợi nào. – jbat100
@ jbat100 Cảm ơn. Tôi chắc chắn nghĩ rằng việc loại bỏ các nhà quan sát trong cả hai dealloc và viewDidUnload là cách duy nhất để đi. – Undistraction