2012-02-13 19 views
10

¿Cuál es la diferencia entre:asignación NSString e inicializar

NSString *string1 = @"This is string 1."; 

y

NSString *string2 = [[NSString alloc]initWithString:@"This is string 2.]; 

¿Por qué no la asignación y la inicialización de la primera cadena, sin embargo, todavía funciona? Pensé que se suponía que debía asignar NSString ya que es un objeto.

En Cocoa Touch,

-(IBAction) clicked: (id)sender{ 
    NSString *titleOfButton = [sender titleForState:UIControlStateNormal]; 
    NSString *newLabelText = [[NSString alloc]initWithFormat:@"%@", titleOfButton]; 
    labelsText.text=newLabelText; 
    [newLabelText release]; 
} 

¿Por qué no asigna e inicializar la cadena titleOfButton? ¿El método que llamo lo hace por mí?

Además, estoy usando XCode 4, pero no me gusta iOS 5, y tal, entonces no uso ARC si eso importa. Por favor, no digan que debería, solo estoy aquí para descubrir por qué esto es así. ¡Gracias!

+0

posible duplicado de [¿Los objetos NSString deben ser alloc e init?] (Http://stackoverflow.com/questions/637022/do-nsstring-objects-need-to-be-alloc-and-init) – Caleb

Respuesta

13

La variable string1 es un NSStringstring literal. El compilador le asigna espacio en su archivo ejecutable. Se carga en la memoria y se inicializa cuando se ejecuta su programa. Vive mientras se ejecuta la aplicación. No necesita retain o release.

La vida útil de la variable string2 es el tiempo que indique, hasta el momento en que release sea su última referencia. Asignas espacio para eso, por lo que eres responsable de limpiarlo después.

La vida útil de la variable titleOfButton es la duración del método -clicked:. Esto se debe a que el método -titleForState: devuelve autorelease -d NSString. Esa cadena se lanzará automáticamente, una vez que abandone el alcance del método.

No necesita crear newLabelText. Ese paso es redundante y desordenado. Basta con establecer los labelsText.text propiedad a titleOfButton:

labelsText.text = titleOfButton; 

Por qué propiedades de uso? Debido a que establecer esta propiedad retain aumentará el recuento de referencia de titleOfButton en uno (por eso se llama propiedad retain), por lo que la cadena apuntada por titleOfButton sobrevivirá al final de -clicked:.

Otra forma de pensar sobre el uso de retain en este ejemplo es que labelsText.text es "tomar posesión" de la cadena apuntada por titleOfButton. Esa cadena ahora durará tanto como labelsText viva (a menos que alguna otra variable también tome posesión de la cadena).

+0

Solo para expandir este punto, las llamadas a 'retener' y' liberar' en los literales de cadena '@' -style en Objective C se ignoran explícitamente. Puedes 'liberarlo' todo el día y no será liberado. – StilesCrisis

+0

Entonces, básicamente, todo lo que tengo en ese código es correcto, y podría simplemente eliminar la nueva cadena LaTexto? Y luego el usuario labelsText sintetizó setter para establecer el título? Todavía soy un poco nuevo, pero cuando dices "establecer esta propiedad de retención", ¿estás diciendo que debería conservarlo? –

+0

La propiedad 'labelsText.text' conserva la cadena en la que lo configuró.Por lo tanto, no necesita usar 'retener', porque está usando la asignación de valores de propiedad para hacer eso por usted. Consulte este tutorial para obtener una explicación más detallada de las propiedades de Objective-C: http://www.raywenderlich.com/2712/using-properties-in-objective-c-tutorial –

Cuestiones relacionadas