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のコピーが1つだけ形成されます。

4

2 に答える 2

2

そのコードスニペット[[keyArray copy] autorelease]では1回だけ実行され、結果は繰り返されるオブジェクトで使用されます。

言い換えると、「列挙のプロセス全体で、そのkeyArrayのコピーが1つだけ形成される」というのは正しいことです。

于 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 に答える