2009-04-11 16 views
5

Ví dụ: khi bộ nhớ yếu, Hệ thống sẽ gửi thông báo UIApplicationDidReceiveMemoryWarningNotification. Đó là tất cả Apple nói trong tài liệu của nó tại thời điểm đó. Nhưng thông báo này đến từ đâu và phương thức nào được gửi? Hoặc ở đâu và làm thế nào để đăng ký những gì tôi nhận được thông báo?Tôi nên đăng ký một đối tượng để nhận thông báo ở đâu và như thế nào?

Trả lời

5

Nó được gửi đến trung tâm thông báo, nơi tất cả các thông báo được tập trung. Một đối tượng muốn được thông báo về thông báo này đăng ký chính nó với trung tâm thông báo bằng cách cho biết thông báo nào muốn được thông báo và phương thức nào sẽ được lập hoá đơn khi thông báo được đưa ra.

Để biết thêm thông tin, bạn có thể xem Notification programming topics for CocoaNSNotification class reference.

17

Từ bên trong mã khởi tạo của lớp bạn muốn nhận thông báo thực hiện phương pháp gọi sau đây:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleMemoryWarning:) name: UIApplicationDidReceiveMemoryWarningNotification object:nil]; 

này giả định rằng lớp học của bạn cũng thực hiện một phương pháp handleMemoryWarning như sau:

- (void) handleMemoryWarning:(NSNotification *)notification 
{ 
} 
+4

Đừng quên gọi removeObserver trong dealloc của lớp đó. – Abizern

+0

Không thể chỉnh sửa. Bộ chọn phải là @selector (handleMemoryWarning :) – DougW

+0

Tôi đã bỏ qua việc sử dụng thẻ mã ban đầu - Đã sửa lỗi. – m4rkk

5

Đơn giản hơn nhiều khi sử dụng ủy nhiệm ứng dụng và triển khai phương thức tùy chọn

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application 

Các thông báo phổ biến nhất cũng có sẵn được dịch thành các cuộc gọi đến một đại biểu, thường là các phương thức tùy chọn trong một giao thức chính thức. Đại biểu của bạn có thể là bất kỳ đối tượng nào bạn thích.

+0

Lưu ý cách bạn nhận tên đại biểu bằng cách lấy tên của thông báo và xóa 'UI' từ đầu,' Thông báo' từ cuối và xuống chữ cái đầu tiên. – Abizern

0

Được cảnh báo rằng bộ chọn của bạn sẽ cần nhận thông báo làm đối số.

Nếu bạn sử dụng một cái gì đó như @selector (handleMemoryWarning) và - (void) handleMemoryWarning {} đối tượng S NOT KHÔNG gửi thông báo và bạn vẫn sẽ giữ tất cả bộ nhớ của mình.

Tôi đã bị cắn bởi điều này.

+1

Hoàn toàn không đúng (và tôi cũng đã thử nó). Bạn có thể sử dụng bộ chọn không có tham số hoặc với tham số. Cũng sử dụng "phần cứng -> mô phỏng cảnh báo bộ nhớ" trong trình mô phỏng iOS. –

+0

Thật sao? Bạn đã thử nghiệm trên tất cả các thiết bị và các phiên bản hệ điều hành? Tôi đã chứng kiến ​​điều này xảy ra trực tiếp trong mã của tôi khi thử nghiệm. –

+0

Hi Ben, tôi không nghi ngờ rằng bạn đã thấy nó trên một số thiết bị và phiên bản hệ điều hành. Điều đó nói rằng, tôi đã không bao giờ nhìn thấy 'performSelector' chăm sóc về một param hay không. Bạn có biết phiên bản thiết bị và hệ điều hành nào không? –