2012-04-12 48 views
21

Thực tiễn tốt là đặt nhiều đối tượng được tự động phát hành tự động trả về trong một autoreleasepool tại hành động lặp. Tôi tìm thấy ai đó đặt @autoreleasepool trong vòng lặp nhưng những người khác đặt vòng lặp trong @autoreleasepool.@autoreleasepool trong vòng lặp hoặc vòng lặp trong @autoreleasepool?

1:

while ([rs next]) { 
    @autoreleasepool { 
     NSDictionary *dict = [self dictFromXX]; 
     //... 
    } 
} 

2:

@autoreleasepool { 
    while ([rs next]) { 
     NSDictionary *dict = [self dictFromXX]; 
     //... 
    } 
} 

Đó là tốt hơn? hoặc bất kỳ sự khác biệt nào giữa mã 1 và 2?

Cảm ơn!

+0

Vòng lặp phải ở bên trong autoreleasepool 2. là chính xác – Charan

+0

Hãy xem [Quản lý bộ nhớ với mục tiêu C/Cocoa/iPhone] (http://memo.tv/archive/memory_management_with_objective_c_cocoa_iphone). –

Trả lời

28

Trong ví dụ đầu tiên của bạn cho mỗi lần lặp, hồ bơi sẽ được thoát. Điều này có ý nghĩa nếu cơ thể của vòng lặp liên quan đến rất nhiều đối tượng được tự động phát hiện.

Ví dụ thứ hai sẽ chỉ xả hồ bơi một lần sau vòng lặp.

Vì vậy, nếu phần bên trong của vòng lặp gây ra hiện tượng sưng lên bộ nhớ thì hãy chọn tùy chọn một. Nếu bloat bộ nhớ trên toàn bộ vòng lặp là chấp nhận được thì vòng lặp sau đó sử dụng tùy chọn hai.

1

tôi sẽ đi cho phiên bản 2.

Một khối @autoreleasepool sẽ phát hành tất cả các đối tượng đã nhận được một autorelease khi khối đã kết thúc. Điều này sẽ mất thời gian bởi vì nó sẽ cần một số chu kỳ CPU và tùy thuộc vào đối tượng, thời gian sử dụng có thể cao hơn rất nhiều sau đó dự kiến.

Tôi nghĩ tùy chỉnh @autoreleasepool s chỉ có ý nghĩa khi làm việc với nhiều dữ liệu> 20MB hoặc làm việc với Dữ liệu trong một chủ đề không chính.

So. Tôi khuyên bạn nên tránh "ngắn" @autoreleasepool 's. Bởi vì nó có thể làm chậm quá trình thực hiện của bạn.

+0

Tôi không hiểu, chu kỳ CPU tổng thể để phát hành sẽ giống nhau vì cuối cùng, tổng đối tượng được giải phóng là giống nhau. Bạn đang nói về chi phí thực hiện kiểm tra hồ bơi autorelease? Tôi không chắc chắn về chi phí ở đó. –

+0

@HelinWang thoát bộ nhớ quá thường có nghĩa là lãng phí các chu kỳ CPU trên NSAutoreleasePool. – Andy

+0

@Andy đây là những gì nhận xét của tôi hỏi: tại sao nó sẽ tiêu hao bộ nhớ quá thường xuyên? --- "cuối cùng, tổng số đối tượng được giải phóng là giống nhau" –

3

Trong ví dụ autoreleasepool đầu tiên được tạo ở đầu lặp lại và được thoát ra và kết thúc lặp lại. Trong trường hợp nhóm thứ hai được tạo ra một lần và chỉ bị hủy sau khi vòng lặp kết thúc. Nếu bạn sử dụng biến thể thứ hai sau đó bạn có thể nhận được một bộ nhớ lớn trên không vì tất cả các đối tượng autoreleased được giải phóng chỉ ở cuối. Tuy nhiên, bạn nên cân nhắc lượng dữ liệu bạn cần xử lý. Trong hầu hết các trường hợp, biến thể thứ hai được ưu tiên hơn.

0

Tùy thuộc vào số lượng mục đang chờ xử lý sẽ được phát hành. Hình ảnh mà Autorelease Pool giống như thùng rác của bạn, đặt những thứ không sử dụng và sẽ ném sau.

0

@autoreleasepool các khối có hiệu quả hơn khi sử dụng phiên bản NSAutoreleasePool trực tiếp; bạn cũng có thể sử dụng chúng ngay cả khi bạn không sử dụng ARC.- NSAutoreleasePool Class Reference

Bạn thường không cần hồ bơi autorelease, nếu bạn làm vì bạn đang ở trong một vòng lặp và autoreleasing rất nhiều đối tượng sau đó lựa chọn 1 có ý nghĩa hơn 2 như bạn đang cố gắng để tránh các cành rằng vòng lặp là tạo. Thời gian để sử dụng tùy chọn 2 là nếu không có nhóm thiết lập autorelease (nếu bạn đang thực hiện một bộ chọn trong nền ví dụ hoặc trong +load), nhưng bạn thực sự nên cố gắng sử dụng GCD cho những thứ đó.

Tóm lại, nếu bạn không có phương pháp rất dài và bạn cần bọc một vòng lặp trong một nhóm tự động, hãy chọn tùy chọn 1 trong hầu hết các trường hợp. Nếu phương pháp đang được gọi mà không có một bể tự động được thiết lập thì @autorelease cần phải là điều đầu tiên.

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