2012-01-03 16 views
13

me he dado cuenta de que hay una manera diferente en Xcode 4.2 para iniciar la función principal:¿Por qué Xcode 4.2 usa @autoreleasepool en main.m en lugar de NSAutoreleasePool?

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

y

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

¿Alguien sabe la diferencia entre los dos?

+0

Se llama ARC (http://clang.llvm.org/docs/AutomaticReferenceCounting.html) – bealex

Respuesta

14

El primero es el uso de ARC, que se implementa en iOS5 y superior para administrar la memoria por usted.

En el segundo caso, está administrando su propia memoria y creando un conjunto de autorrelease para manejar cada liberación automática que ocurra dentro de su función principal.

Así que después de leer un poco sobre lo que es nuevo en Obj-C con IOS5 parece que el:

@autoreleasepool { 
    //some code 
} 

funciona igual que

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

con la diferencia de que esta última debería tirar un error en ARC.

EDITAR:

El primero está utilizando ARC o no.

+19

Tenga en cuenta que @autoreleasepool es un nuevo tipo de declaración disponible en Objective-C y puede utilizarse independientemente de ARC. Ver [1] (http://clang.llvm.org/docs/AutomaticReferenceCounting.html#autoreleasepool) [2] (http://stackoverflow.com/questions/7950583/autoreleasepool-without-arc) – albertamg

+6

'@ autoreleasepool' es el camino a seguir ahora. Desde "Transitioning to ARC Release Notes" de Apple: _Esta sintaxis está disponible en todos los modos Objective-C. Es más eficiente que usar la clase 'NSAutoReleasePool'; por lo tanto, le recomendamos que lo adopte en lugar de utilizar 'NSAutoReleasePool'. –

+0

¡Bien, gracias chicos! – Foo