Перечисление и удаление определенного объекта из NSMutableArray - PullRequest
2 голосов
/ 06 мая 2011

У меня проблемы с удалением предметов из моего NSMutableArray. Я чрезвычайно новичок в Objective-C, поэтому, пожалуйста, потерпите меня.

Пока у меня есть следующее: я пытаюсь удалить строку из массива, если внутри него есть определенный текст. Я не могу сделать это при быстром перечислении, поэтому я пытаюсь сохранить индекс для удаления после завершения перечисления. Однако мне говорят, что это делает указатель из целого числа без приведения. Confused!

//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];

Ответы [ 3 ]

0 голосов
/ 06 мая 2011

Вы можете сделать это без цикла, вызвав [hostFileOriginalArray removeObjectIdenticalTo:@"Offending"];

Обратите внимание, что он удалит несколько экземпляров объекта-нарушителя, но в любом случае это похоже на то, что вы хотите. Он также выполнит операцию быстро, без необходимости беспокоиться о деталях реализации того, какой цикл использовать.

Как правило (особенно с действительно часто используемыми объектами, такими как контейнеры и NSString), проверьте ссылку на класс, чтобы увидеть, есть ли у Apple способ сделать то, что вы хотите. Это делает ваш код более читабельным для других пользователей Какао (в том числе и для вас в будущем) и сокращает объем обслуживания кода. Теперь вы оставляете за Apple право добавлять новые технологии, такие как Fast Enumeration, в свой код, и вы получаете его бесплатно, когда переходите по ссылке против новых версий SDK.

Кроме того, вам, вероятно, следует возвращать hostFileOriginalArray в конце функции, чтобы он мог сделать что-то полезное - вы можете вернуть его как объект с автоматическим выпуском.

0 голосов
/ 07 мая 2011
//Remove offending entry from Array.
[hostFileOriginalArray removeObjectAtIndex:hostFileOffendingLocation];

//Release the Array. 
[hostFileOriginalArray release];

вы должны были получать предупреждения компилятора ... посмотрите на них, они обычно очень полезны, я всегда стараюсь получить 0 предупреждений ... таким образом я знаю, где я сделал что-то небрежное.

0 голосов
/ 06 мая 2011

Мой реальный вопрос: почему вы освобождаете свой массив перед его изменением

попробуйте переместить

[hostFileOriginalArray release];

до

[hostFileOriginalArray removeObject:hostFileOffendingLocation];
...