Usando alloc, init en proyectos habilitados para ARC

En realidad, estoy trabajando en un proyecto con ARC habilitado. Sé que usando alloc y init está alloc del object. Lo sé, si creo una cadena como esta

 NSString *myString = [[NSString alloc]initWithFormat:@"Something"]; 

entonces necesito release el myString en mí mismo. ¿Qué pasa si estoy usando ARC habilitado? No puedo soltarme. Entonces, ¿creará una fuga? ¿O no debería crear un object como este?

Puedo crear una cadena como el código debajo también.

 NSString *myString = [NSString stringWithFormat:@"Something"]; 

¿Pero qué tipo necesito usar exactamente para el proyecto habilitado ARC? ¿Qué sucederá si utilizo el primer tipo?

Si usa ARC, todas las llamadas de release necesarias se agregarán para usted cuando compile. No se filtrará

La diferencia entre

 NSString *myString = [[NSString alloc]initWithFormat:@"Something"]; 

y

 NSString *myString = [NSString stringWithFormat:@"Something"]; 

es que el primero se lanzará automáticamente después de la última reference a myString en ese bloque, mientras que el segundo será una instancia autoreleased que solo se lanzará al final del ciclo de ejecución. No es una gran diferencia, pero si estás usando muchos objects, trata de evitar los autoelevados para mantener bajo el uso de la memory.

ARC se encarga de la gestión de la memory, por lo que no es necesario que se preocupe por la release llamadas en su variable myString , ARC lo hará por usted. También como sugerencia, recomendaría utilizar methods de conveniencia para crear su object, como

[NSString stringWithFormat:@"Something"];

Es suficiente para establecer el puntero de cadena a cero para liberarlo.
También puede hacer las mismas cosas que podría hacer sin ARC, pero con la ventaja de que si no hace algo explícitamente, el ARC administrará (casi) todo para usted.

Entonces, para liberarlo, lo establece en cero, veamos qué más puede hacer:

  NSString* str= [[NSString alloc]initWithUTF8String: "Hello"]; // here the retain count of str is 1 __unsafe_unretained NSString* string= str; // again 1 because string is __unsafe_unretained void* data= (__bridge_retained void*) string; // data retains the string, so the retain count is to 2 // This is useful in the case that you have to pass an objective-c object // through a void pointer.You could also say NSString* data= string; str=nil; // Here the retain count of str is 1 NSLog(@"%@",(__bridge NSString*)data); 

ACTUALIZAR

Este es el motivo por el que a veces no se da count de que se lanza un object:

  NSString* str= [[NSString alloc]initWithString: @"hey"]; __unsafe_unretained NSString* str2=str; str=nil; NSLog(@"%@",str2); 

En este caso str = [[NSString alloc] initWithString: @ "hey"] es igual a str = @ "hey", con la diferencia de que str es autoreleased y no lanzado. Pero el comstackdor optimiza el código en str = @ "hello ", entonces si está dentro de un bloque de autorelease no tendrá ningún problema, str2 se imprimirá correctamente.
Es por eso que usé initWithUTF8String, para evitar esa optimization del comstackdor.