0

我试图在枚举时更改数组的内容。为了避免警告“在枚举时数组发生了变异”,我复制了数组并像这样完成了自动释放-

int iKeyArrayCount=0;
        for(NSString *keyEntity in [[keyArray copy]autorelease])
        {
            [keyArray replaceObjectAtIndex:iKeyArrayCount withObject:[keyEntity stringByReplacingOccurrencesOfString:@"\"" withString:kMPVTBlankString]];
            [keyArray replaceObjectAtIndex:iKeyArrayCount withObject:[keyEntity stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
            iKeyArrayCount++;
        }

我的困惑是关于 keyArray 副本的枚举。虽然枚举是这样的,但每次执行 for 循环时都会形成一个 keyArray 的副本?或者在整个枚举过程中只形成了那个keyArray的一个副本。

4

2 回答 2

2

在该代码片段[[keyArray copy] autorelease]中只执行一次,结果用于被迭代的对象。

也就是说,“在整个枚举过程中只形成了那个keyArray的一个副本”是正确的。

于 2012-09-06T06:15:49.447 回答
0

为此复制整个数组是没有意义的。您也可以只使用常规的 for 循环而不是枚举:

for (NSInteger i = 0; i < [keyArray count]; i++)
{
    NSString *keyEntity = [keyArray objectAtIndex:i];
    NSString *newKeyEntity = [keyEntity stringByReplacingOccurrencesOfString:@"\\" withString:@" "];
    newKeyEntity = [newKeyEntity stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    [keyArray replaceObjectAtIndex:i withObject:newKeyEntity];
}

如果您开始在循环中添加/删除对象,事情可能会变脏,但只要您只是替换它们就可以了。

您可能已经注意到这stringByReplacingOccurrencesOfString:withString:在您的示例中没有用,因为您再次在下一行替换它。

于 2012-09-07T10:00:28.027 回答