Trong ca cao, addObserver:forKeyPath:options:context:
giữ lại "không phải người nhận, cũng không phải máy chủ an toàn". Do đó tôi cho rằng việc quan sát bản thân được phép; có nghĩa là, nó hoàn toàn hợp lệ để làm điều gì đó nhưQuan sát tự trong Cocoa
[self addObserver:self forKeyPath...]
Chừng nào bạn nhớ để unregister self
như một người quan sát là điều đầu tiên trong dealloc.
Giả định này có đúng không?
Đây không phải là một ý tưởng hay. Người ta thường hy vọng rằng 'obj.foo = bar;' phải tương đương với '[obj setFoo: bar];' và straying từ mẫu này sẽ gây nhầm lẫn cho người khác đang đọc/duy trì mã của bạn – rpetrich
@rpetrich Tôi đồng ý rằng điều này không một ý tưởng hay (tôi đã viết câu trả lời đó hơn 18 tháng trước), nhưng vì một lý do khác. Tôi sẽ không còn sử dụng '@ synthesize' nữa; Bây giờ tôi sẽ viết toàn bộ getter và setter. Các gánh nặng thêm của một vài dòng phụ trội hơn chi phí tinh thần sau các cuộc gọi phương thức bổ sung (tôi vẫn còn sử dụng '@ property'). Tôi không đồng ý rằng các tác dụng phụ ở những người định cư (hoặc getters) vốn đã xấu. Họ nên tránh nếu có thể. Ví dụ, thiết lập 'hypotheticalQueryObject.maxResults = 4;' có thể kích hoạt một tìm kiếm hợp pháp khác. –
@rpetrich Điều đó thực sự được đảm bảo. 'obj.foo = bar;' luôn sử dụng bất kỳ việc thực thi 'setFoo:' nào được cung cấp (ngay cả khi bạn đã ghi đè một cái tổng hợp). –