He escrito esta función que mezcla el contenido de un NSString
, y parece funcionar, pero de vez en cuando se cuelga. Esto puede ser una forma indirecta, pero pongo los caracteres en una matriz, intercambiamos los elementos en la matriz aleatoriamente, y luego volvemos a convertir la matriz en una cadena.Mezclar letras en un NSString en Objective-C
No estoy seguro de lo que estoy haciendo que no es seguro que hace que se bloquee. Pensé que posiblemente estaba configurando finalLettersString = result
, pero también intenté finalLettersString = [NSString stringWithString:result]
y eso también falla. La razón por la que estoy confundido es porque no se cuelga todo el tiempo. Sigo presionando el botón de reproducción aleatoria y, a veces, falla. ¿En cuales lugares debo mirar?
/* This function shuffles the letters in the string finalLettersString */
-(IBAction)shuffleLetters:(id)sender{
int length = [finalLettersString length];
NSMutableArray * letters = [NSMutableArray arrayWithCapacity:length];
NSLog(@"final letters: %@", finalLettersString);
for(int i = 0; i < length; i++){
char ch = [finalLettersString characterAtIndex:i];
NSLog(@"%c", ch);
NSString * cur = [NSString stringWithFormat:@"%c", ch];
[letters insertObject:cur atIndex:i];
}
NSLog(@"LETTERS:: %@", letters);
for(int i = length - 1; i >= 0; i--){
int j = arc4random() % (i + 1);
//NSLog(@"%d %d", i, j);
//swap at positions i and j
NSString * str_i = [letters objectAtIndex:i];
[letters replaceObjectAtIndex:i withObject:[letters objectAtIndex:j]];
[letters replaceObjectAtIndex:j withObject:str_i];
}
NSLog(@"NEW SHUFFLED LETTERS %@", letters);
NSString * result = @"";
for(int i = 0; i < length; i++){
result = [result stringByAppendingString:[letters objectAtIndex:i]];
}
NSLog(@"Final string: %@", result);
finalLettersString = result;
finalLetters.text = finalLettersString;
}
Gracias! Definitivamente una solución mucho mejor. Un problema en realidad fue que no puede usar NSUIntegers, porque - en 0 lleva a un número realmente grande y no a -1 ya que no está firmado. Lo tengo para trabajar usando Ints y retención. En esta situación, ¿cree que es preferible retener o asignar explícitamente? – jkeesh
@jkeesh: Buen punto sobre los enteros sin signo. Con respecto a la asignación explícita, depende de la plataforma objetivo. Si tiene como objetivo el iPhone, algunos dicen que debe evitar el grupo de liberación automática cuando puede hacerlo elegantemente, pero para Mac OS X (es decir, sistemas con mucha más memoria que el iPhone) no habrá una diferencia notable. Personalmente, siempre asigno explícitamente en lugar de contrarrestar un 'autorelease' con un 'tener', pero el resultado es el mismo de cualquier manera. – dreamlax
En esta época de internacionalización, no se puede asumir que unichar se asigna a un personaje. – JeremyP