2011-07-06 39 views
7

NSAutoreleasePool .. sẽ chỉ có một? Tại sao bạn muốn có nhiều hơn một? Bạn có bao giờ muốn có nhiều hồ bơi như một phần của một lớp học không?Chúng tôi có thể có nhiều NSAutoReleasePools không? Tại sao điều này lại cần thiết?

Nếu bạn có nhiều hồ bơi, nhóm nào sẽ chứa đối tượng được yêu cầu là [autorelease] d? Có cách nào để tìm ra những đồ vật nào đang chờ để được tự động phát hành như một phần của một hồ bơi?

Xin lỗi vì 20 câu hỏi, xin vui lòng giúp tôi hiểu được điều này tốt hơn

Trả lời

12

NSAutoreleasePool .. nên có thể chỉ có một?

Không, không nhất thiết. Bạn có thể tạo bao nhiêu nhóm tự động phát hành như bạn muốn/cần.

Tại sao bạn muốn có nhiều hơn thì một? Bạn có muốn có thêm hơn một hồ bơi như một phần của một lớp không?

Ý tưởng là giữ cho bộ nhớ của bạn "dấu nước cao" càng thấp càng tốt. Sử dụng autorelease là một chút gian lận để trì hoãn việc phát hành đối tượng của bạn cho đến "sau". Đôi khi bạn biết khi nào "sau" là - và trong những trường hợp này, có thể là thông minh để tạo hồ bơi tự động của riêng bạn.

Tôi có ý gì với tất cả điều này? Hãy tưởng tượng bạn có vòng lặp sau:

for (...) 
{ 
    // 1 MB of objects are added to the autorelease pool by some code... 
} 

1 MB là rất nhiều! Nếu mã đó lặp lại 20 lần, bạn sẽ có 20MB đối tượng chờ đợi để được phát hành. Thậm chí tệ hơn, nếu nó chạy trong một số lần không xác định hoặc không xác định, ứng dụng của bạn có thể sụp đổ rất tốt. Nếu bạn biết rằng đang khép kín bạn có thể buộc bất cứ điều gì mà được đưa vào bể bơi autorelease trong khối đó để phát hành bằng cách tạo ra hồ bơi autorelease riêng của bạn bằng tay, như vậy:

for (...) 
{ 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    // 1 MB of objects are added to the autorelease pool by some code... 
    [pool drain]; 
} 

Now "nhãn hiệu nước cao của bạn "chỉ có 1MB thay vì 20MB (hoặc nhiều hơn!).

Nếu bạn có nhiều hồ bơi, trong đó sẽ chứa đối tượng được yêu cầu là [autorelease] d?

Loại gần đây nhất.

Hãy tưởng tượng có ngăn xếp chung. Khi bạn khởi động một AutoreleasePool mới, nó sẽ tự thêm vào ngăn xếp tự động toàn cầu này. Khi bạn gọi [xxx autorelease] trên một đối tượng, phương pháp autorelease sẽ xem xét hồ bơi tự động trả lời ở đầu ngăn xếp này và tự thêm chính nó vào danh sách đối tượng của nhóm tự động phát hành. Khi bạn gọi số [pool drain], nhóm đó lặp lại tất cả các tham chiếu đã được thêm vào nó và gọi số [xxx release] trên tất cả các tài liệu đó.

Như BJ Homer chỉ ra, ngăn xếp trong đoạn trên không thực sự thực sự toàn cầu - thực sự có một ngăn xếp cho mỗi luồng. Nhưng tôi không thể tìm ra cách viết lại đoạn trên và giữ nó dễ hiểu bằng cách sử dụng các thuật ngữ như "thread-local" ... do đó ... phụ lục này sẽ phải đủ:)

+1

Vâng, nó thực sự là một ngăn xếp luồng cục bộ, không phải ngăn xếp chung.Nhưng nếu không được viết tốt. –

+0

@BJ Homer, Cảm ơn, điểm tốt. Đã cập nhật bài đăng. – Steve

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