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.
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 –
"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
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