2011-12-03 9 views
5

El libro que estoy leyendo actualmente me ha escribir el siguiente código:NSArray y NSString

-(IBAction)displaySomeText:(id)sender { 
    NSString *cow = @"Milk"; 
    NSString *chicken = @"Egg"; 
    NSString *goat = @"Butter"; 

    NSArray *food = [NSArray arrayWithObjects:cow, chicken, goat, nil]; 

    NSString *string = @"The shopping list is: "; 
    string = [string stringByAppendingString:[food componentsJoinedByString:@", "]]; 

    [textView insertText:string]; 

}

entiendo un poco cómo funcionan las matrices pero necesito ayuda para entender el siguiente código

string = [string stringByAppendingString:[food componentsJoinedByString:@", "]]; 

Nunca he visto una instancia en la que esto sea posible.

Me tiene crear un objeto de 'cadena', de la clase NSString, y luego estoy haciendo esto

string = [string stringByAppendingString:]; 

estoy confundido. Nunca he visto un ejemplo donde creo un objeto y luego realizo un método en el mismo objeto y lo almaceno en ese mismo objeto exacto.

Por ejemplo, sé que puedo hacer esto

NSSound *chirp; 
chirp = [NSSound soundNamed:@"birdChirp.mp3"]; 

lo anterior tiene sentido porque he utilizado el objeto creado y realizado un método de clase en ella ..

pero siempre supuse que el equivalente del siguiente código NO fue posible

chirp = [chirp methodNameEtc..]; 

Espero haber explicado bien mi pregunta. Si no, siempre podría elaborar más.

Respuesta

4

Creo que este es el corazón de su pregunta "Estoy confundido. Nunca he visto un ejemplo donde creo un objeto y luego realizo un método en el mismo objeto y lo almaceno exactamente en ese mismo objeto".

Para responder a esa pregunta, no es realmente 'almacenándolo exactamente en el mismo objeto'. Lo que está haciendo es confundir pointers y objects.

Vamos a mirar a esta línea:

string = [string stringByAppendingString:@"Hello"];

En esta línea 'cadena' es un pointer, no el object que apunta. Lo que esta línea de código está diciendo es: "Object actualmente referenciado por el pointer 'cadena', volverá a mí un nuevo NSStringobject cuyo texto es el texto con este texto añadido y cuando llegue ese nuevo NSStringobject pedí hacer el. pointer 'cadena' apunte a eso object en su lugar. "

+0

Sí, gracias. Esta es la mejor respuesta hasta ahora. Me alegro de que hayas visto todo eso, jaja. Muchas gracias. –

+1

Esta pregunta puede sonar tonta pero no programo mucho en ObjC: dado que las cadenas son inmutables, esto no causaría una pérdida de memoria ya que el objeto de cadena original ahora no tiene un puntero (ya que stringByAppendingString devuelve un nuevo objeto de cadena) ? – styfle

+0

Sí. La cadena anterior ha sido desreferenciada como dices. Esto está bien si el objeto desreferenciado se libera automáticamente o se crea un literal de cadena como 'NSString * cow = @" Milk "' pero si se trata de una cadena retenida que sería una pérdida de memoria. Curiosamente, la mayoría de las preguntas sobre pérdida de memoria en este sitio parecen ser personas que confunden punteros y objetos. – NJones

2
string = [string stringByAppendingString:[food componentsJoinedByString:@", "]]; 

es la misma que

NSString *tmpString = [food componentsJoinedByString:@", "]; 
string = [string stringByAppendingString:tmpString]; 

Así, en el ejemplo, los corchetes más internos se evalúan primero, y luego la más exterior. ¿Eso lo aclara un poco? Apenas como paréntesis en matemáticas: (1 * 2 * (1 + 2)) ... el más interno() se evalúa antes de poder determinar que el problema real es 1 * 2 * 3. Eso es lo que está sucediendo con [food componentsJoinedByString:@", "].

1

stringByAppendingString no está almacenando la cadena exactamente en el mismo objeto. Es un objeto NSString que crea un nuevo objeto (autorelleno) NSString.

No hay ningún ejemplo equivalente para chirp (que es un objeto NSSound), a menos que cree su propia categoría que se extiende NSSound con un método para devolver un nuevo objeto NSSound.

Tiene sentido?

Ah, también aprecio su icono de Takizawa.

+0

Muchas gracias a todos los que respondieron. Ahora lo entiendo. –

Cuestiones relacionadas