2009-04-28 27 views
19

Trong nhiều Sách và trên nhiều Trang web, tôi xem -drain. Vâng, cho một hồ bơi Autorelease mà âm thanh mát mẻ. Nhưng liệu nó có làm gì khác ngoài bản phát hành không? Tôi đoán rằng, việc này chỉ khiến cho Pool trở thành -release tất cả các đối tượng của nó, mà không cần giải phóng Pool. Chỉ cần đoán thôi.Sự khác biệt giữa việc gửi -release hoặc -drain tới một Autorelease Pool là gì?

Trả lời

25

Lưu ý rằng các nhận xét về câu trả lời của oxigen nói rằng -drain không giải phóng NSAutoreleasePool không chính xác. Các documentation for NSAutoreleasePool rõ ràng nói rằng bản phát hành -drain (và do đó phá hủy) NSAutoreleasePool.

Điều chỉnh là sự thay thế cho việc sử dụng - cho các đối tượng NSAutoreleasePool, sự khác biệt duy nhất là cung cấp gợi ý cho hệ thống thu gom rác.

+0

Cảm ơn. Vì vậy, trên hệ điều hành iPhone nó tốt hơn để sử dụng -release hơn là -drain? – Thanks

+1

Trong môi trường không phải GC, chúng giống nhau. Ngoại trừ trong trường hợp hiếm hoi mà bạn không muốn cung cấp gợi ý cho hệ thống GC vì một số lý do nếu mã đã từng được sử dụng ở chế độ GC, không có lý do gì để sử dụng bản phát hành thay vì thoát trong mã nhắm mục tiêu 10.4+. – smorgan

+1

Apple sử dụng -release cho ARP trong hàm main() ... – Thanks

10

Nếu hệ thống của bạn có một Bộ sưu tập rác, sau đó -drain gửi tin nhắn (objc_collect_if_needed) cho GC

Nếu bạn chưa có GC, sau đó thoát = phát hành

+0

do đó, bản vẽ cũng sẽ giải phóng chính bản thân hồ bơi, phải không? – Thanks

+1

các phương pháp đặc biệt và -drain không thay đổi retainCount của đối tượng NSAutoreleasePool Chúng chỉ gửi thông báo phát hành tới tất cả các đối tượng trong hồ bơi Tôi không biết, cách thức và thời điểm các đối tượng NSAutoreleasePool bị hủy (( – oxigen

+1

Không, thoát nước) Không có phép thuật khi nói đến các nhóm autorelease và giữ lại số lượng, chúng tuân theo các quy tắc tương tự như bất kỳ đối tượng nào khác ngoại trừ chúng không thể được giữ lại hoặc tự động phát hiện (điều đó sẽ không có ý nghĩa nhiều lắm) –

10

Oxigen là đúng, hãy xem tài liệu cho phương pháp drain của NSAutoreleasePool:

Trong môi trường được tính tham chiếu, phát hành và bật trình thu; trong một môi trường thu gom rác thải , kích hoạt bộ sưu tập rác nếu bộ nhớ được phân bổ vì bộ sưu tập cuối cùng lớn hơn ngưỡng hiện tại .

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