2009-07-18 28 views
5

Tôi đang phát triển cho iPhone, mục tiêu-c. Khi chúng ta sử dụng autorelease, khi nào đối tượng thực sự được giải phóng - khi nhóm autorelease chính được giải phóng (ví dụ: ứng dụng kết thúc?), Hoặc ngay khi hàm cục bộ kết thúc? Ví dụ: Tôi muốn thực hiện một việc như sau:Khi nào một đối tượng có 'autorelease' được phát hành?

 
- (void) test 
{ 
    MyObj* p = [[[MyObj alloc] init] autorelease]; 
    ... 

    // is p 'released' here? 
} 

Vì vậy, 'p' được phát hành ngay khi thoát khỏi chức năng hoặc khi nhóm tự động phát hành chuỗi này được phát hành? Tôi nghĩ đó là khi thoát chức năng địa phương, nhưng tôi vừa mới tạo chủ đề của riêng tôi và cần thiết để thiết lập một hồ bơi autorelease được đem lại cho tôi những suy nghĩ thứ hai trên khi điều này thực sự xảy ra ..

Cảm ơn

Trả lời

6

Một autoreleases đối tượng là phát hành cùng một lúc autorelease pool là. Vì vậy, cho chủ đề của bạn nó sẽ được phát hành khi bạn phát hành các hồ bơi. Trong chủ đề chính, nếu bạn không tạo ra riêng của mình, tôi tin rằng các hồ bơi autorelease được rút ra mỗi lần thông qua các vòng lặp chạy - nhưng tôi đã không nhìn vào trong một thời gian.

+1

Đây là liên kết tới trang trên các nhóm tự động phát hành: http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html – Jonathon

1

Như Argothian nói, nó được giải phóng khi bể tự động phát hành, xảy ra mỗi lần trong vòng lặp chạy trong ứng dụng Cocoa thông thường, không khi chấm dứt ứng dụng (trừ khi bạn không có vòng lặp chạy) , trong trường hợp đó, bạn phải tạo nhóm tự động phát hành và tự giải phóng nó). Các nhóm tự động phát hiện không biết về từng cuộc gọi hàm riêng lẻ và do đó không thể giải phóng mọi thứ ở cuối cuộc gọi hàm.

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