2008-12-07 9 views
14

Tôi có câu hỏi kỹ thuật. Đây KHÔNG phải là câu hỏi về mã hóa thích hợp.Là đối tượng phát hành trên chương trình Exit thực sự cần thiết?

Câu hỏi của tôi là TECHNICALLY đang phát hành các đối tượng khi thoát chương trình/đóng cần thiết?

Nói cách khác, hãy nói vì lợi ích của đối số, bạn có một nút đóng ứng dụng của bạn, nhưng ngay trước khi bạn đóng bạn hiển thị một hình ảnh, và sau đó bạn đóng ứng dụng.

Bạn có cần phải giải phóng chế độ xem hình ảnh đó trước khi đóng ứng dụng không? Bộ nhớ sẽ tự động được giải phóng khi chương trình thoát ra, hoặc nếu bạn không phát hành nó sẽ bộ nhớ ở lại bằng cách nào đó "hoạt động"?

Tôi hiểu rằng bạn "nên" phát hành nó, câu hỏi của tôi là về khía cạnh kỹ thuật của nó và những gì xảy ra sau hậu trường.

Cảm ơn bạn.

Trả lời

26

Không cần thiết. Nhưng nếu bạn đang sử dụng valgrind hoặc một công cụ tương tự, bạn sẽ sớm khám phá ra rằng để lại tất cả các bộ nhớ của bạn lúng túng đầm lầy bạn với cảnh báo sai.

Về phía Linux, mọi thứ được phát triển bằng cách sử dụng cuộc gọi hệ thống sbrk. Điều này làm tăng không gian bộ nhớ tổng thể của một khối lớn tại một thời điểm (do đó chỉ cần một sbrk để cung cấp đủ không gian cho nhiều malloc s). Khi quá trình này biến mất, hạt nhân sẽ thu hồi tất cả bộ nhớ được phân bổ bởi sbrk. Đây là lý do tại sao bạn an toàn. Hạt nhân cũng sẽ đóng mọi tập tin mô tả được mở bởi một tiến trình đó.

Có một số vấn đề có thể xảy ra. Nếu quá trình của bạn bao giờ là fork giây tại thời điểm không hiệu quả, mọi bộ mô tả tệp đang mở sẽ được sao chép. Tôi đã thấy biểu hiện này chính nó như là một kết nối TCP bí ẩn treo sống sau khi quá trình ban đầu đã chết, đó là khó chịu. Ngoài ra, còn có các tài nguyên khác không được xử lý theo phạm vi, vì vậy chúng sẽ không được khai hoang khi quá trình này bị chết. Điều này bao gồm các phân đoạn bộ nhớ chia sẻ, các tệp tạm thời, các đường ống có tên và các ổ cắm UNIX, và có lẽ là một loạt các cơ chế IPC khác.

Tóm tắt? Bộ nhớ là tốt. Mô tả tệp thường tốt. Một số tính năng IPC bí truyền hơn sẽ bị phá vỡ khủng khiếp nếu không được làm sạch.

1

Thực tế nó không cần thiết, nhưng nếu bạn có thể muốn tái chế một số nguồn của bạn và sử dụng nó trong một chương trình khác, bạn có thể bị rò rỉ bộ nhớ. Bên cạnh đó, không bao giờ xem xét hệ điều hành mà không có bất kỳ lỗi nào. Nó có thể "quên" để giải phóng một số tài nguyên.

4

Trên iPhone, bạn không cần, và theo như tôi biết, bạn không thể. Sau khi nhận được applicationWillTerminate: bạn có một vài giây để lưu trạng thái của bạn và sau đó hệ điều hành sẽ giết chết quá trình của bạn. Xây dựng một trong các ứng dụng mẫu và đặt điểm ngắt trong một trong các phương thức dealloc. Họ không bao giờ bị tấn công.

Đây là một cuộc tranh luận lớn về nó: link text

Lưu ý: C dealloc Mục tiêu không phải là điều tương tự như C++ Deconstructor. Trong một Deconstructor bạn có thể đóng các tập tin, xử lý, vv Trong Objective C dealloc chỉ để giải phóng bộ nhớ. Bạn phải đóng các tài nguyên khác của bạn trước đó vì dealloc có thể không bao giờ được gọi.

0

Việc phát hành có thể giúp bạn tìm lỗi. Các vấn đề bộ nhớ động không thường xuyên hơn kích hoạt tại thời điểm phát hành (ví dụ: bạn cố gắng phát hành một đối tượng không hợp lệ).Luôn phát hành có thể giúp bạn xác định các lỗi mà nếu không sẽ khó tìm.