2011-02-09 8 views
9
#import <UIKit/UIKit.h> 

int main(int argc, char *argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    int retVal = UIApplicationMain(argc, argv, nil, nil); 
    [pool release]; 
    return retVal; 
} 

Phương thức chính gọi phát hành trên hồ bơi sau khi thoát khỏi ứng dụng, tình cờ gửi bản phát hành tới tất cả các đối tượng trong hồ bơi. Nhưng vì các đối tượng autoreleased được tạo bên trong ứng dụng không dính xung quanh cho đến khi ứng dụng thoát ra, tại một thời điểm nào đó trong runloop, pool được xả hoặc phát hành (trong ngữ cảnh của iPhone, drain == release .. trừ khi tôi cần phải sửa chữa vào thời điểm này!). Nhưng không ai biết chắc chắn khi điều này xảy ra? Nó sẽ có vẻ hợp lý cho các hồ bơi được thoát nước ở phần cuối của một runloop, và một cái mới được phân bổ vào đầu tiếp theo, nhưng tôi không thể tìm thấy bất kỳ thông tin dứt khoát về điều này. Here's a discussion trên diễn đàn táo, nhưng dường như có tính đầu cơ cao (chưa kể đến sự tranh cãi, về phía cuối). Có ai cho tôi câu trả lời hay không, lý tưởng là bằng chứng từ tài liệu hoặc mã nguồn (hoặc thậm chí là một chương trình thử nghiệm)?Khi nào thì Bể bơi tự động chính trong Ca-cao cảm ứng được thoát nước?

+0

hồ bơi cụ thể mà bạn tham chiếu không được thoát cho đến cuối ứng dụng, nhưng mỗi lần gọi vòng lặp chạy sẽ tạo nhóm riêng của nó, được lồng trong vòng chạy của ứng dụng. – cobbal

+0

Điều đó có ý nghĩa. Vì vậy, nếu tôi không bao giờ tạo hồ bơi của riêng tôi, một ứng dụng nhất định sẽ có hai nhóm lồng nhau theo mặc định? – jakev

+0

Yup; hồ bơi ngoài trời và hồ bơi đạp xe trong vòng chạy. UIApplicationMain() có thể tạo/thoát các pool như là một chi tiết thực hiện. – bbum

Trả lời

11

Từ NSAutoreleasePool Class Reference:

Đơ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.

+0

Tôi đã bỏ lỡ điều đó như thế nào? cảm ơn ... – jakev

+0

Trong trường hợp có bất kỳ nghi ngờ nào, cả phiên bản OS X và phiên bản iOS của tài liệu NSAutoreleasePool đều chứa tuyên bố này, vì vậy dường như nó đúng trên cả hai nền tảng. – Sandy