2010-11-10 26 views
73

Thông thường, nếu bạn sinh ra một chuỗi nền hoặc chạy một NSOperation trên NSOperationQueue, bạn cần phải tạo một NSAutoreleasePool cho chủ đề hoặc hoạt động đó vì không tồn tại theo mặc định.Bạn có cần tạo một NSAutoreleasePool trong một khối trong GCD không?

Quy tắc tương tự áp dụng cho một khối được đặt trong hàng đợi Công văn Grand Central và sẽ được chạy trên một chuỗi không chính? Đó là, bạn cần phải tạo một NSAutoreleasePool trong mỗi khối bạn gửi đến bất cứ điều gì khác hơn là hàng đợi chính?

Trong thử nghiệm giới hạn của mình, tôi không thấy cảnh báo bảng điều khiển cho các đối tượng được tự động phát hành mà bạn thường thấy với chủ đề nền hoặc NSOperations. Tuy nhiên, tôi không thể tìm thấy tài liệu dứt khoát về điều này, vì vậy tôi đã tự hỏi nếu ai đó có thể chỉ ra nơi này được nêu.

+0

Từ câu trả lời đăng bởi @Gustavo Ambrozio đó đã được gỡ bỏ, các [tài liệu là ở đây] (http://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues. html # // apple_ref/doc/uid/TP40008091-CH102-SW17), trong trường hợp người xem quan tâm. – iDev

Trả lời

107

Có cùng một quy tắc áp dụng cho một khối đó được đặt trong một hàng đợi Grand Central Dispatch và sẽ được chạy trên một sợi phi chính ? Tức là, bạn có cần để tạo NSAutoreleasePool trong vòng mỗi khối bạn gửi đến bất kỳ thứ gì ngoài hàng đợi chính không?

Công văn trung tâm lớn sẽ tự động quản lý một nhóm tự động trả hàng cho mỗi hàng đợi. Tuy nhiên, không có sự đảm bảo nào về thời điểm hồ bơi sẽ được thoát nước; nó có thể là sau khi một khối được xử lý, nó có thể sau hàng trăm (nhưng có lẽ sẽ không được).

Vì vậy, nếu bạn chỉ phân bổ một vài đối tượng, đừng lo lắng về điều đó. Tuy nhiên, nếu bạn đang phân bổ bất kỳ số lượng đáng kể các đối tượng nào (và vì bạn đang nhắm mục tiêu một môi trường hạn chế bộ nhớ), thì bạn nên tạo và thoát các nhóm.


Tài liệu đã được cập nhật.

Xem https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW1

Nếu khối của bạn tạo ra nhiều hơn một vài đối tượng Objective-C, bạn có thể muốn gửi kèm theo các phần của mã của khối của bạn trong một khối @autorelease để xử lý việc quản lý bộ nhớ cho những các đối tượng. Mặc dù GCD công văn hàng đợi có hồ bơi tự động trả lại của riêng mình, họ không đảm bảo là khi các hồ đó bị cạn kiệt. Nếu ứng dụng của bạn là bộ nhớ bị hạn chế, việc tạo hồ bơi tự động của riêng bạn cho phép bạn giải phóng bộ nhớ cho các đối tượng được tự động phát hành theo các khoảng thời gian đều đặn hơn.

+3

+1 trong tài liệu này có ở đâu không? –

+6

Không đủ rõ ràng. Đã gửi lỗi tài liệu (). – bbum

+3

Tuyệt vời. Cảm ơn bạn đã làm rõ. –

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