2012-01-03 6 views
13

Я заметил, что есть другой способ в Xcode 4.2, чтобы начать основную функцию:Почему Xcode 4.2 использует @autoreleasepool в main.m вместо 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; 
} 

Кто-нибудь знает разницу между этими двумя?

+0

Это называется ARC (http://clang.llvm.org/docs/AutomaticReferenceCounting.html) – bealex

ответ

14

Первый использует ARC, который реализован в iOS5 и выше для управления памятью для вас.

На втором вы управляете своей собственной памятью и создаете пул автозапуска, чтобы обрабатывать каждую автоматическую проверку, которая происходит внутри вашей основной функции.

Таким образом, после прочтения немного о том, что нового на Obj-C с iOS5 оказывается, что:

@autoreleasepool { 
    //some code 
} 

работает так же, как

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

с той разницей, что последний будет бросать ошибка в ARC.

РЕДАКТИРОВАТЬ:

Первый использует ARC или нет.

+19

Обратите внимание, что @autoreleasepool - это новый вид утверждения, доступный в Objective-C, и может использоваться независимо от ARC. См. [1] (http://clang.llvm.org/docs/AutomaticReferenceCounting.html#autoreleasepool) [2] (http://stackoverflow.com/questions/7950583/autoreleasepool-without-arc) – albertamg

+6

'@ autoreleasepool' это путь. Из «Переход к примечаниям о выпуске ARC от Apple»: _ Этот синтаксис доступен во всех режимах Objective-C. Он более эффективен, чем использование класса 'NSAutoReleasePool'; поэтому вам рекомендуется принять его вместо использования «NSAutoReleasePool». –

+0

Ницца, спасибо, ребята! – Foo

 Смежные вопросы

  • Нет связанных вопросов^_^