2012-01-03 34 views
13

tôi đã nhận thấy rằng có một cách khác nhau trong Xcode 4.2 để bắt đầu chức năng chính:Tại sao Xcode 4.2 sử dụng @autoreleasepool trong main.m thay vì NSAutoreleasePool?

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool { 
     return UIApplicationMain(argc, argv, nil, 
           NSStringFromClass([PlistAppDelegate class])); 
    } 
} 

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

Có ai biết sự khác biệt giữa hai?

+0

Nó được gọi là ARC (http://clang.llvm.org/docs/AutomaticReferenceCounting.html) – bealex

Trả lời

14

Đầu tiên là sử dụng ARC, được triển khai trong iOS5 trở lên để xử lý quản lý bộ nhớ cho bạn.

Trên thiết bị thứ hai, bạn đang quản lý bộ nhớ của riêng mình và tạo một nhóm tự động xử lý mọi tự động phát hiện xảy ra bên trong chức năng chính của bạn.

Vì vậy, sau khi đọc một chút về những gì mới trên obj-C với iOS5 nó xuất hiện rằng:

@autoreleasepool { 
    //some code 
} 

hoạt động giống như

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
// some code 
[pool release]; 

với sự khác biệt mà người cuối cùng sẽ ném một lỗi trên ARC.

EDIT:

Người đầu tiên được sử dụng ARC hay không.

+19

Lưu ý rằng @autoreleasepool là một loại tuyên bố mới có sẵn trong Mục tiêu-C và có thể được sử dụng bất kể ARC. Xem [1] (http://clang.llvm.org/docs/AutomaticReferenceCounting.html#autoreleasepool) [2] (http://stackoverflow.com/questions/7950583/autoreleasepool-without-arc) – albertamg

+6

'@ autoreleasepool' là con đường để đi ngay bây giờ. Từ "Ghi chú phát hành chuyển tiếp sang ARC" của Apple: Cú pháp này có sẵn trong tất cả các chế độ Objective-C. Nó hiệu quả hơn việc sử dụng lớp 'NSAutoReleasePool'; do đó, bạn được khuyến khích sử dụng nó thay cho việc sử dụng 'NSAutoReleasePool'._ –

+0

Rất tốt, cảm ơn các bạn! – Foo

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