2010-07-07 24 views
5

Bạn có thể sử dụng -removeObserver: trước tiên và sau đó gọi -addObserver: có cùng tên không? Hoặc trước tiên, có một quy tắc để có -addObserver: trước -removeObserver: không?truy vấn addobserver/removeobserver

Tôi đã thử sử dụng OS 4.0 và có vẻ như OK (không có sự cố, cảnh báo ... v.v.).

-(void) setObserver 
{ 
[[NSNotificationCenter defaultCenter] removeObserver:self 
               name:OBSERVER_NAME object:nil]; 

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector: @selector(selectorName) 
              name:OBSERVER_NAME 
              object:nil]; 
} 

Lý do là để ngăn chặn hai nhà quan sát với cùng phương pháp selectorName được gọi hai lần giả định rằng phương pháp -setObserver được gọi một lần nữa nếu bên trong của nó -viewDidLoad và cảnh báo bộ nhớ đã được ban hành.

Ngoài ra, tôi có cần gọi số -removeObserver: trong thời gian -dealloc không?

+0

+1 câu hỏi hay. Tôi không biết nếu nó lưu để loại bỏ một Observer mà không được đăng ký trước, nhưng tôi biết đó là phải để loại bỏ các quan sát viên trước khi deallocing. Đối với trường hợp cụ thể của bạn, bạn cũng có thể xóa người quan sát trong viewDidUnload. Đó là những gì phương pháp này là để: Cân bằng tất cả các cuộc gọi được thực hiện trong loadView và viewDidLoad. – tonklon

Trả lời

3

Nếu bạn nhận được -selectorName được gọi hai lần, có thể có một số vấn đề khác với mã của bạn. Và ngay cả khi Cocoa sẽ được duyên dáng về việc loại bỏ các nhà quan sát bạn chưa thêm vào, tôi sẽ không thực sự làm điều đó.

Khi người dùng tonklon nói trong nhận xét, có thể bạn nên xóa người quan sát trong -viewDidUnload. Đối với câu hỏi cuối cùng của bạn, bạn cũng nên loại bỏ người quan sát trong -dealloc, mặc dù thực hành tốt để cấu trúc mã của bạn sao cho những thứ như loại bỏ người quan sát xảy ra tại thời điểm xác định thay vì là tác dụng phụ của quản lý bộ nhớ.