2

からアイテムを削除できませんNSMutableArray。私はObjective-Cに非常に慣れていないので、ご容赦ください。

これまでのところ、私は次のことをしています: 特定のテキストが内部にある場合、配列から行を削除しようとしています。高速列挙中にこれを行うことはできないため、列挙が終了した後に削除するために、インデックスを保存しようとしています。ただし、これはキャストなしで整数からポインターを作成すると言われています。混乱している!

//First remove any previous Offending entry.
//Read hostfile into array.
NSString *hostFileOriginalString = [[NSString alloc] initWithContentsOfFile:@"/etc/hosts"];
NSMutableArray *hostFileOriginalArray = [[hostFileOriginalString componentsSeparatedByString:@"\n"] mutableCopy];
NSInteger hostFileOffendingLocation;

//Use a for each loop to iterate through the array.
for (NSString *lineOfHosts in hostFileOriginalArray) {

    if ([lineOfHosts rangeOfString:@"Offending"].location != NSNotFound) {

    //Offending entry found, so remove it.
    //[hostFileOriginalArray removeObject:lineOfHosts];

    hostFileOffendingLocation = [hostFileOriginalArray indexOfObject:lineOfHosts];
    //NSLog(@"%@", hostFileOffendingLocation);
}

}
//Release the Array. 
[hostFileOriginalArray release];

//Remove offending entry from Array.
[hostFileOriginalArray removeObject:hostFileOffendingLocation];
4

3 に答える 3

0
//Remove offending entry from Array.
[hostFileOriginalArray removeObjectAtIndex:hostFileOffendingLocation];

//Release the Array. 
[hostFileOriginalArray release];

コンパイラの警告が表示されているはずです...それらを見てください。通常は非常に役立ちます。私は常に警告を0にしようとします...そうすれば、不注意なことをどこで行ったかがわかります。

于 2011-05-06T22:26:02.107 に答える
0

私の本当の質問は、なぜ配列を変更する前に配列を解放するのですか

動かしてみる

[hostFileOriginalArray release];

後に

[hostFileOriginalArray removeObject:hostFileOffendingLocation];
于 2011-05-06T18:41:57.373 に答える
0

を呼び出すことで、ループなしでこれを行うことができます[hostFileOriginalArray removeObjectIdenticalTo:@"Offending"];

問題のあるオブジェクトの複数のインスタンスが削除されることに注意してください。また、使用するループの実装の詳細について心配する必要なく、高速な方法で操作を実行します。

原則として (特に、コンテナや NSString のような非常に一般的に使用されるオブジェクトの場合)、クラス リファレンスをチェックして、Apple があなたのやりたいことを実行する方法を既に持っているかどうかを確認してください。これにより、他の Cocoa ユーザー (将来のあなたを含む) がコードを読みやすくなり、コードのメンテナンスが軽減されます。Fast Enumeration などの新しいテクノロジーを Apple に任せて、リンクすると無料で入手できます。 SDK の新しいバージョンに対して。

また、おそらく関数の最後に hostFileOriginalArray を返す必要があるため、何か便利なことを行うことができます-自動解放されたオブジェクトとして返すことができます。

于 2011-05-06T18:42:55.347 に答える