NSArray到NSMutableArray作为随机堆栈

时间:2010-02-04 19:36:16

标签: iphone nsmutablearray

首先是概念性描述:

我正在从文本文件(单词列表)中读取输入,并使用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失效 - 但我无法想象会发生这种情况。

2 个答案:

答案 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.

希望这能解决一些问题。