一個NSString我寫了這個功能,混洗NSString
的內容,似乎工作,但每一個現在,然後崩潰。這可能是一種迂迴的方式,但是我將這些字符放入一個數組中,隨機交換數組中的元素,然後將數組轉換回字符串。洗牌字母在Objective-C的
我不知道我在做什麼是不安全的,這使得它崩潰。我認爲這是可能的,我設置finalLettersString = result
,但我也試過finalLettersString = [NSString stringWithString:result]
並且還崩潰。我感到困惑的原因是它不會每次都崩潰。我只是不停地按下shuffle按鈕,有時它會崩潰。我應該看的任何地方?
/* 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;
}
謝謝!絕對是一個更好的解決方案。其中一個問題實際上是你不能使用NSUInteger,因爲 - 在0上導致一個非常大的數字而不是-1,因爲它沒有簽名。我使用了整數並保留了它。在這種情況下,你認爲最好保留還是明確分配? – jkeesh 2010-09-10 07:25:08
@jkeesh:關於無符號整數的好處。關於明確分配,它取決於目標平臺。如果你的目標iPhone,有人說,以避免自動釋放池時,你可以優雅地這樣做,但爲Mac OS X(即具有比iPhone更多的內存系統),它將使沒有明顯的區別。就我個人而言,我總是明確地分配,而不是用'retain'來抵抗'autorelease',但結果是一樣的。 – dreamlax 2010-09-10 07:29:46
在這個國際化的時代,你不能假設一個unichar映射到一個角色。 – JeremyP 2010-09-10 07:45:02