首先是概念性描述:
我正在从文本文件(单词列表)中读取输入,并使用NSArray
方法将这些单词放入componentsSeparatedByString
。这很有效。
但我想随机选择单词,然后从数组中删除它们,以确保每次都有不同的单词。当然,您无法更改NSArray
内容。所以......
我将NSArray
的内容复制到NSMutableArray
并使用IT作为选择来源。这也有效 - 每个数组中有269个对象。
要从NSMutableArray
返回单词,请使用以下代码:
注意 - 数组是全局声明的
如
arrMutTextWords = [[NSMutableArray alloc] init]; //stack for words
arrTextWords = [[NSArray alloc] init]; //permanent store for words
-(NSString*) getaTextWord
{
// if the mutable text word array is empty refill
if ([arrMutTextWords count] == 0){
for (int i = 0 ; i < [arrTextWords count]; i++)
[arrMutTextWords addObject:[arrTextWords objectAtIndex:i]];
}
int i = random() % [arrMutTextWords count];
NSString* ptrWord = [arrMutTextWords objectAtIndex:i];
[arrMutTextWords removeObjectAtIndex:i];
return ptrWord;
}
程序在调用上述方法时崩溃 - 这是调用代码: arrTmp全局声明为arrTmp = [[NSArray alloc] init]; // tmp store for words
for (int i = 0 ; i < 4; i++) {
tmpWord = [self getaTextWord];
[arrTmp addObject:tmpWord];
[arrTmp addObject:tmpWord];
}
我认为以某种方式删除arrMutTextWords
中的字符串会导致NSArray
失效 - 但我无法想象会发生这种情况。
答案 0 :(得分:4)
问题的一个可能来源是从列表中提取和删除NSString
对象。删除它会释放NSString
实例,从而导致您的引用失效。
要保留引用,您应该使用此代码序列:
NSString * ptrWord = [[[arrMutTextWords objectAtIndex:i] retain] autorelease];
[arrMutTextWords removeObjectAtIndex:i];
return ptrWord;
顺便说一下:你应该使用
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray: array];
而不是手动复制所有值。虽然我不知道NSMutableArray
的实现,但我很久以前就知道了(NeXTstep),有几种可能的优化可以加速基本的NSArray
操作。
最后以这种方式复制更简洁。
答案 1 :(得分:0)
刚刚通过XCode运行并返回了随机单词,但是我跳过整个for循环并使用addObjectsFromArray
中的NSMutableArray
。
NSArray *randomArray = [[NSArray alloc] initWithObjects:@"Paul", @"George", @"John", nil];
NSMutableArray *muteArray = [[NSMutableArray alloc] init];
[muteArray addObjectsFromArray:randomArray];
int i = random() % [muteArray count];
NSString* ptrWord = [muteArray objectAtIndex:i];
[muteArray removeObjectAtIndex:i];
NSLog(@"ptrWord %@", ptrWord); //gave me a different name each time I ran the function.
希望这能解决一些问题。