2015-04-21 21 views
11

Có phải loại bỏ tất cả NSNotificationCenter.defaultCenter sau đây đã được thêm vào theo tên chế độ xem?Does removeObserver() loại bỏ tất cả các quan sát viên?

NSNotificationCenter.defaultCenter().removeObserver(self) 

Nếu tôi có các điểm sau trong cùng một chế độ xemDidLoad(), chúng có bị xóa bằng một dòng ở trên không?

NSNotificationCenter.defaultCenter().addObserver(self, selector: "method1", name: UITextFieldTextDidChangeNotification, object: nil) 

NSNotificationCenter.defaultCenter().addObserver(self, selector: "method2", name: UITextViewTextDidChangeNotification, object: nil) 

Trả lời

0

Xóa tất cả các mục chỉ định một người quan sát nhất định từ bảng công văn của người nhận. https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/index.html#//apple_ref/occ/instm/NSNotificationCenter/removeObserver:

Vì vậy, tôi đoán nó sẽ xóa tất cả người quan sát chỉ khi tất cả đều giống như được chỉ định bởi tham số.

+0

Tôi đã cập nhật câu hỏi. Mặc dù hai nhà quan sát trong OP có hai tên phương thức khác nhau, nhưng một dòng mã nên loại bỏ cả hai bên phải? – 4thSpace

+0

Xem câu trả lời của tôi cho câu hỏi của bạn. Câu trả lời là có, nhưng không sử dụng nó. –

+0

Câu trả lời của bạn là mơ hồ. "Tham số" là gì? – 4thSpace

31

Có, cuộc gọi removeObserver(self) sẽ xóa tất cả các quan sát viên bạn đã thêm bằng cách sử dụng addObserver:selector:name:object: với người quan sát về bản thân, bất kể tên thông báo, đối tượng hoặc bộ chọn bạn đã chỉ định. Bạn có thể sử dụng phương phápở bất kỳ đâu, nhưng trong phương thức deinit của đối tượng, vì một số lớp hệ thống (hoặc các lớp con của các đối tượng mà bạn xác định) có thể đã thêm các quan sát viên mà bạn không biết. Cuộc gọi phương thức đó là "trái đất cháy sém" gọi là loại bỏ TẤT CẢ người quan sát khỏi đối tượng.

Thay vào đó bạn nên gọi removeObserver:name:object: và chỉ xóa những người quan sát mà bạn đã thêm.

+0

Nếu tôi xóa các tên này theo tên, tôi nên xóa phương pháp nào? Tôi đã tải thông qua viewDidLoad(). Tôi không nhận được bất kỳ autocomplete cho một deinit. – 4thSpace

+0

Tìm kiếm nó trong tài liệu tham khảo ngôn ngữ Swift iBook (miễn phí.) Nếu bạn thêm một người quan sát trong viewDidLoad (chỉ được gọi một lần khi tạo bộ điều khiển khung nhìn) thì bạn cần phải thực hiện cuộc gọi cân bằng để removeObserver trong 'deinit 'phương thức bạn thêm vào. Phương thức 'deinit' của bạn sẽ được gọi ngay trước khi đối tượng của bạn bị deallocated. –

+1

Tôi đã thêm một deinit vào UIViewController của mình. Làm cách nào để kiểm tra điều này trong trình mô phỏng? Nó không kích hoạt với một nút bấm nhà hoặc tắt ứng dụng. – 4thSpace

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