枚举中的复制和自动释放

时间:2012-09-06 06:10:18

标签: objective-c cocoa for-loop enumeration

我试图在枚举时更改数组的内容。为了避免警告,“数组在枚举时被突变”我制作了一个数组的副本并像这样做了自动释放 -

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的副本。

2 个答案:

答案 0 :(得分:2)

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

换句话说,“在整个枚举过程中只形成一个keyArray的副本”是正确的。

答案 1 :(得分: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:在您的示例中没用,因为您再次在下一行中替换它。