6

Theo sự hiểu biết của tôi, khi một đối tượng được gửi một thông báo autorelease, nếu không có các nhóm tự động tồn tại khác với số trong main.m, đối tượng được đặt trong một trong main.m. Giả sử điều này là chính xác, tôi có một vài câu hỏi:Tự động chia sẻ các hồ bơi trong Objective-C - phát hành chính AutoreleasePool?

1) Tất cả các đối tượng tự động được lưu lại trong hồ bơi đó cho đến khi kết thúc ứng dụng?

2) Nếu 1 là đúng, không tạo đối tượng tự động chạy mà không có nhóm tự động phân phối cục bộ (do đó đặt đối tượng đó trong hồ bơi main.m) giữ đối tượng đó trong bộ nhớ cho đến khi kết thúc ứng dụng hoặc cảnh báo bộ nhớ?

3) Khi nào là main.m kênh tự động thoát nước, trừ khi ứng dụng nhận được cảnh báo bộ nhớ hoặc ứng dụng bị chấm dứt?

Ví dụ, trong một phương pháp đại biểu cellForRowAtIndexPath như thế này:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Foobar"]; 
if (cell == nil) { 
    // No cell to reuse => create a new one 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"Foobar"] autorelease]; 

    // lots of custom stuff 
} 

return cell; 

khi được các tế bào thực sự phát hành? Họ phải được tự động phát hành, bởi vì bạn không thể giải phóng chúng trước khi bạn trả lại chúng, và bạn không thể giải phóng chúng sau, bởi vì chúng nằm ngoài phạm vi. Theo sự hiểu biết hiện tại của tôi, các tế bào được đặt trong hồ bơi tự động phát trên cùng, và được giải phóng khi hồ bơi đó được xả/giải phóng. Trong trường hợp này, đó sẽ là nhóm autorelease duy nhất trong ứng dụng; một trong số main.

4) Vấn đề với điều này là ngay cả khi tôi làm xong với các ô đó và bộ điều khiển xem đã được giải phóng, các tế bào vẫn còn trong bộ nhớ, phải không? Nếu đây không phải là trường hợp, ai đó có thể cung cấp một lời giải thích về cách quản lý bộ nhớ trong tình huống này thực sự hoạt động? Cảm ơn!

Lưu ý: Tôi đã xem tài liệu của Apple, nhưng nó chủ yếu nói về thời điểm sử dụng các nhóm tự động trả lời cục bộ của riêng bạn, nhưng không nhiều về cách chúng thực sự hoạt động.

Trả lời

5

1) Tất cả các đối tượng tự động được lưu lại trong hồ bơi đó cho đến khi kết thúc ứng dụng?

Đối tượng tự động theo định nghĩa được sở hữu bởi hồ bơi tự động của họ cho đến khi hồ đó thoát. Khi bạn gửi -autorelease đến một đối tượng, đối tượng đó sẽ được thêm vào danh sách các đối tượng mà nhóm sẽ phát hành sau này. Các bể tự động được tổ chức trong một ngăn xếp, với hồ bơi ở phía trên cùng của ngăn xếp là hồ bơi mà bất kỳ đối tượng nào được gửi -autorelease được thêm vào. Các hồ bơi được tạo ra trong main() thường không phải là một ở trên cùng của ngăn xếp. Ví dụ, vòng lặp chạy sẽ tạo ra một nhóm autorelease ở đầu mỗi lần lặp.

2) Nếu 1 là đúng, không tạo ra một đối tượng autoreleased mà không có một địa phương hồ bơi autorelease (do đó đặt đối tượng đó trong hồ bơi main.m) giữ đối tượng trong bộ nhớ cho đến khi chấm dứt của ứng dụng hoặc một ký ức Bạn nhận được cảnh báo ?

Nếu hồ bơi được tạo trong main() là hồ bơi trên cùng, nhưng như được mô tả ở trên, thường không phải như vậy.

3) Khi nào hồ bơi tự động main.m thoát nước, trừ khi ứng dụng nhận được cảnh báo bộ nhớ hoặc ứng dụng bị chấm dứt?

Không có sự khác biệt giữa hồ bơi được tạo trong main() và bất kỳ hồ bơi tự động phát hành nào khác. Tất cả chúng đều cạn kiệt khi hồ bơi được giải phóng hoặc ở cuối khối nếu bạn sử dụng chỉ thị @autorelease.

+0

Hmm ... Tôi đã khá sai. Về rất nhiều thứ! Cảm ơn bạn đã tiết lộ một số ánh sáng –

+8

"Các đối tượng được tự động phát hiện theo định nghĩa được giữ lại bởi nhóm tự động trả lời" Điều này không chính xác. Các bể tự động không giữ lại bất kỳ thứ gì. Tự động phát hiện không là gì ngoài cơ chế thông báo bị trì hoãn. Khi bạn gửi -autorelease đến một đối tượng, nó không làm tăng số lượng giữ lại của nó. Nó thêm đối tượng vào một danh sách các đối tượng sẽ được gửi một tin nhắn -release khi bản thân autorelease pool được phát hành hoặc gửi một thông báo -drain. – NSResponder

+3

Một vài điểm bổ sung: (1) Các nhóm tự động trả tiền theo mỗi luồng và do đó, một đối tượng tự động không bao giờ có thể được truyền giữa hai luồng một cách an toàn. (3) Các hồ bơi cấp cao nhất có thể không bao giờ thoát nước bởi vì không có điểm; nếu một ứng dụng đang bị chấm dứt, nó sẽ gửi thông báo cuối cùng "tôi ra khỏi đây" và sau đó thoát() trực tiếp mà không làm phiền đến việc thoát khỏi hồ bơi. – bbum

7

Từ documentation:

Đơn Kit tạo ra một hồ bơi autorelease về các chủ đề chính tại đầu mỗi chu kỳ của vòng lặp sự kiện và cống nó ở cuối, do đó giải phóng bất kỳ đối tượng autoreleased tạo ra trong khi xử lý một sự kiện. Nếu bạn sử dụng Bộ công cụ ứng dụng, do đó bạn thường không phải tạo hồ bơi của riêng mình. Nếu ứng dụng của bạn tạo ra nhiều đối tượng được tự động phát hành tạm thời trong vòng lặp sự kiện, tuy nhiên, có thể có ích khi tạo các nhóm tự động phát hiện "cục bộ" để giúp giảm thiểu dấu chân bộ nhớ cao nhất.

Vì vậy, đối tượng được tự động phát trong nhóm mặc định sẽ chỉ tồn tại trong thời gian diễn ra sự kiện hiện tại.

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