2009-08-21 6 views
5

Trong câu hỏi của tôi về việc sử dụng một đại biểu hoặc một sự kiện UIControl, đây là trong Kendall Helmstetter Geln của câu trả lời:iPhone dev - đại biểu, thông báo, hủy đăng ký trước khi deallocated?

Cả hai đều là về một tải bằng để làm việc với - với một đại biểu bạn phải thiết lập cho mình và sau đó nhớ unset mình trước khi bạn được deallocated. Bạn phải làm điều tương tự với các thông báo, hãy nhớ bắt đầu nghe và sau đó hủy đăng ký trước khi bạn được deallocated.

Ý của chúng là gì, hủy đăng ký trước khi deallocated, bỏ đặt chính mình? Tôi đã không làm bất cứ điều gì đó. Ai đó có thể vui lòng giải thích nó là gì và làm thế nào để làm điều đó?

Cảm ơn !!

Trả lời

8

Bạn cần xóa chính mình làm đại biểu nếu tuổi thọ của bạn ngắn hơn đối tượng bạn được ủy quyền. Trong hầu hết các trường hợp, tuổi thọ của bạn bằng hoặc dài hơn đối tượng bạn được ủy nhiệm. Điều đó nói rằng, đó là một thói quen tốt để có được vào. Hãy xem xét trường hợp bạn là đại biểu cho một UITableView. Trong -init, có lẽ bạn gọi:

self.myTableView.delegate = self; 

Sau đó, nó sẽ có khả năng được khôn ngoan trong -dealloc nói

_myTableView.delegate = nil; 
[_myTableView release]; 
_myTableView = nil; 

Lý do để làm điều này là myTableView có thể được giữ lại bởi các đối tượng khác, như vậy có thể không deallocate khi bạn thả nó ra. Nếu nó làm cho một cuộc gọi đại biểu sau khi bạn đã đi, ứng dụng của bạn sẽ sụp đổ. Vì vậy, thanh toán bù trừ con trỏ đại biểu là một ý tưởng tốt ở đây.

Tương tự như vậy cho NSNotificationCenter, bạn nên xóa bản thân trong -dealloc như sau:

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

này loại bỏ bạn khỏi tất cả những quan sát. Bạn nên làm điều này trong -dealloc nếu lớp học của bạn từng đăng ký bất kỳ thông báo nào. Nếu bạn không làm điều này và thông báo bạn đang quan sát đến sau khi bạn rời đi, ứng dụng sẽ bị lỗi.

Điều này là không cần thiết đối với NSTimers vì NSTimers giữ lại mục tiêu của chúng (bạn).

+1

Cảm ơn! Và những gì về sự kiện UIControl? Tôi có nên làm [myButton removeTarget: ....] không? – mk12

+0

Và điều này cũng áp dụng cho DataSources? – mk12

+0

Đối với UIControl, đây là một câu hỏi thú vị. Tôi không chắc liệu addTarget: ... có giữ lại hay không. Nếu không, thì bạn nói đúng, có lẽ bạn nên loại bỏ chính mình. Datasources giống hệt với các đại biểu. –

1

Tôi tin rằng bạn chỉ cần đặt đại biểu thành không.

myOjectOrClass.delegate = nil; 
+0

Vì vậy, bạn phải làm điều này cho mỗi đại biểu bạn chỉ định? Điều gì sẽ xảy ra nếu bạn không? Điều gì về các sự kiện (với [control addTarget: self action: ....)? – mk12

+0

Và làm thế nào đến trong cuốn sách của tôi và trong ví dụ mã tôi chưa bao giờ thấy điều này? – mk12

+0

chúng tôi đi đến cùng một đại biểu được thiết lập để nil trước khi gọi phát hành. –

1

Không giữ lại được thực hiện đối với mục tiêu khi được chuyển đến phương pháp addTarget UIControl. Mặc dù tài liệu không đề cập cụ thể về điều này, tôi đã viết một bài kiểm tra đơn giản để chứng minh thực tế này.

Nếu bạn thêm mục tiêu làm người quan sát sự kiện của điều khiển và sau đó thả nó, bạn sẽ thấy số lần giữ lại giảm xuống (có khả năng dẫn đến việc bị thu hồi).

Điều này có nghĩa là kiểm soát sẽ không bao giờ ngăn không cho mục tiêu bị phân phối.