16

Chúng tôi có phải gửi removeObserver: một cách rõ ràng cho các đối tượng đã được thêm làm người quan sát cho một số NSNotificationCenter trước đây không?Trong ARC, chúng ta có cần gửi removeObserver: rõ ràng không?

Tôi hơi bối rối và không thể tìm thấy câu trả lời chính xác cho việc này.

Vui lòng cung cấp cho tôi chi tiết, về điều này bao gồm lý do tại sao chúng tôi cần removeObserver một cách rõ ràng và tại sao trình biên dịch không đặt nó ngầm trong lớp/ứng dụng?

Trả lời

13

Có, bạn cần gọi removeObserver:, nếu bạn không có lớp được quan sát có thể gọi tất cả phiên bản được phân phối của người quan sát.

+2

Sau đó, tại sao ARC không đề phòng điều này? Giống như nó đặt [... phát hành]; tại sao nó không đặt [... removeObserver: ...]?/ –

+7

Tất nhiên NSNotificationCenter biết ai đang quan sát: Nó phải chuyển tiếp các thông báo, sau khi tất cả. Dường như họ có thể đã sử dụng các tham chiếu yếu bằng 0 để đảm bảo rằng các thông báo không được gửi tới các nhà quan sát tự do. Nhưng tôi đã thực hiện một bản demo nhanh chỉ để kiểm tra kỹ và nó có bị sập nếu bạn không gọi removeObserver: trong dealloc. Dang. – davehayden

+0

Nó không cần thiết vì có thể có một tham chiếu yếu cho người quan sát, nhưng trừ khi Apple giải thích rõ ràng rằng nó không cần thiết, nó là cần thiết. Có lẽ một yêu cầu tính năng chúng tôi cần phải thực hiện. –

5

Xóa người quan sát luôn là ý tưởng thông minh. Nếu bạn không xóa người quan sát, tin nhắn vẫn sẽ được gửi, ngay cả khi đối tượng đã được deallocated. Nó thậm chí có thể được gắn vào một đối tượng khác, điều này chắc chắn sẽ dẫn đến rắc rối nghiêm trọng.

+0

Không cần thiết nếu bạn đang nhắm mục tiêu iOS 9 trở lên, điều này sẽ là khá nhiều người trong tương lai. –

2

Bạn luôn cần phải xóa người quan sát cho KVO cũng như Thông báo.

7

Từ 10,11 người quan sát không bắt buộc phải hủy đăng ký theo phương pháp deallocation của họ.

NSNotificationCenter và NSDistributedNotificationCenter không còn gửi thông báo cho người quan sát đã đăng ký có thể bị giải thể. Nếu người quan sát có thể được lưu trữ dưới dạng tham chiếu không yếu, lưu trữ cơ bản sẽ lưu trữ người quan sát dưới dạng tham chiếu yếu zeroing. Cách khác, nếu đối tượng không thể được lưu trữ yếu (vì nó có cơ chế lưu giữ/giải phóng tùy chỉnh có thể ngăn thời gian chạy từ có thể lưu trữ đối tượng yếu) đối tượng được lưu trữ dưới dạng tham chiếu zero-weak zeroing yếu. Điều này có nghĩa là các nhà quan sát không được yêu cầu để hủy đăng ký theo phương thức deallocation của họ. [1]

+0

Cảm ơn Parag, vì đã thêm vào đây. Ngay cả tôi cũng không nhận thức được điều này. –

+1

Càng mất nhiều thời gian sử dụng SDK cũ, câu trả lời này càng chính xác hơn các câu trả lời khác. Đó là một sự xấu hổ mà nó được liệt kê như là câu trả lời cuối cùng. – otto

+1

Điều này cũng đúng cho iOS9 cũng như (nhưng không phải iOS8). Tham khảo: http://useyourloaf.com/blog/unregistering-nsnotificationcenter-observers-in-ios-9/ –

Các vấn đề liên quan