2009-07-21 16 views
16

Duplicar posible:
How do I concatenate strings in Objective-C?Cómo concatenar cadena en Objective-C (iPhone)?

En primer lugar, la plataforma es iPhone y label.text cambia la etiqueta mostrada. Considere este escenario:

Tengo una matriz de enteros. Y quiero mostrarlo en la pantalla.

Aquí está mi opinión sobre ella:

-(IBAction) updateText: (id)sender { 
    int a[2]; 
    a[0]=1; 
    a[1]=2; 
    a[2]=3; 
    for (int i=0; i<=10;i++) 
    label.text = [NSString stringByAppendingString: [NSString stringWithFormat: @"%i", a[i]]]; 
} 

Como podrán ver, estoy muy confundido. Pls pls me ayude :(

+0

Un poco tarde pero inicializa su matriz con el tamaño 2, por lo que el índice más alto sería 1, pero está haciendo un [2] = 3; lo que causaría un error fuera de límites. – Jonny

Respuesta

35

Prueba esto:

NSMutableString* theString = [NSMutableString string]; 
for (int i=0; i<=10;i++){ 
    [theString appendString:[NSString stringWithFormat:@"%i ",i]]; 
} 
label.text = theString; 
+0

Esto solo es posible en NSMutableString, ¿verdad? Me estoy confundiendo con todas estas diferentes clases y sus métodos ... Pero, hombre. Esto es justo lo que necesito. :) – r0ach

+0

appendString: está solo en NSMutableString, pero una función similar es stringByAppendingString: en NSString. –

+1

@TomDalling: He utilizado el mismo enfoque, pero se declara 'theString' en el archivo .h ya que el delegado dentro del cual se realiza el apéndice se invoca varias veces. Ahora, en este caso, estoy obteniendo un 'theString' vacío. ¿Alguna solución? –

3

Otro método sin utilizar NSMutableString:

NSString* theString = @""; 
for (int i=0; i<=10;i++){ 
    theString = [theString stringByAppendingFormat:@"%i ",i]; 
} 
label.text = theString; 

Aquí es una implementación completa (corrección de sus rangos):

-(IBAction) updateText: (id)sender { 
    int a[3]; 
    a[0]=1; 
    a[1]=2; 
    a[2]=3; 
    NSString *str = @""; 
    for (int i=0; i<3;i++) 
     str = [str stringByAppendingFormat:@"%i ",i]; 
    label.text = str; 
} 

También podría hacerlo así (por ejemplo, si desea una lista separada por comas):

-(IBAction) updateText: (id)sender { 
    int a[3]; 
    a[0]=1; 
    a[1]=2; 
    a[2]=3; 
    NSMutableArray *arr = [NSMutableArray arrayWithCapacity:3]; 
    for (int i=0; i<3;i++) 
     [arr addObject:[NSString stringWithFormat:@"%i",i]]; 

    label.text = [arr componentsJoinedByString:@", "]; 
} 
+1

Si bien el programador LISP en mí prefiere el enfoque NSString sobre NSMutableString, realmente debe tener cuidado con el impacto de memoria de su primera solución. Para un bucle tan pequeño, no es gran cosa, pero esto es O (n^2) en la memoria y puede causar problemas en el iPhone, donde incluso un pico de memoria de vida corta es un problema. –

+0

Muy cierto. El método de matriz es mucho mejor por esta razón. (Sería mejor aún si hubiera hecho [NSMutableArray alloc] y [arr release] ...) También da más flexibilidad en la cadena de unión sin tener que preocuparse por perder la coma o el espacio al principio o al final de la lista. – Benjie

17

Dado que está utilizando un bucle, tenga cuidado con las soluciones de Tom y Benjie. Cada uno de ellos crea un objeto autoreleasado extra por iteración. Para un bucle pequeño, está bien, pero si el tamaño del bucle no tiene límites o si las cuerdas son grandes, esto puede provocar un pico de memoria muy grande y un golpe de rendimiento. Particularmente en el iPhone, este es exactamente el tipo de bucle que puede conducir a problemas de memoria sorprendentes debido a picos de memoria de vida corta.

La siguiente solución tiene una huella de memoria más pequeña (también es un poco más rápida y requiere menos tipeo). Tenga en cuenta la llamada al -appendFormat: en lugar de -appendString. Esto evita crear una segunda cadena que será desechada. Recuerde que la cadena final tiene un espacio extra al final del que puede desear deshacerse. Puede solucionarlo tratando la primera o la última iteración de forma diferente o recortando el último espacio después del bucle.

NSMutableString* theString = [NSMutableString string]; 
for (int i=0; i<=10;i++){ 
    [theString appendFormat:@"%i ",i]; 
} 
label.text = theString; 

No olvide [NSArray componentsJoinedByString:]. En este caso, no tiene un NSArray, pero en los casos comunes en que lo hace, esta es probablemente la mejor manera de obtener lo que está buscando.

7
//NSArray *chunks 
string = [chunks componentsJoinedByString: @","];