2011-05-06 9 views
2

NSMutableArray에서 항목을 제거하는 데 문제가 있습니다. 나는 Objective-C에 매우 새로운 것이므로 나와 함께 견뎌주십시오.NSMutableArray에서 특정 개체 열거 및 제거

지금까지 다음과 같은 사항이 있습니다. 특정 텍스트가 내부에있는 경우 배열에서 선을 제거하려고합니다. 빨리 열거하는 동안이 작업을 수행 할 수 없으므로 열거가 완료된 후 제거를 위해 인덱스를 저장하려고합니다. 그러나, 이것은 캐스트없이 정수로부터 포인터를 만든다고 들었습니다. 혼란스러워!

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

이렇게하면 정수를'removeObject :'에 전달하기 때문에 캐스트가없는 정수에서 포인터를 만듭니다. 난'removeObjectAtIndex :'당신이 무엇을하고 있다고 생각합니다. 또한, 왜 개체를 제거하기 전에 배열을 릴리스 있습니까? – albertamg

답변

0

내 진짜 질문은 왜

[hostFileOriginalArray removeObject:hostFileOffendingLocation]; 
+0

감사합니다. 나는 그것을 지금 바꿨다. 그러나 원래의 문제는 여전히 존재합니다. – Phill

+1

hrmmmm 흥미로운 –

+0

원래 배열에서가 아니라 가변 배열에서 제거 된 것으로 나타나고 있습니까? 아니면 여전히 둘 다에 나타나 있습니까? 나는 당신이 mutablecopy를 사용하고 그것이 데이터의 사본을 생성하고 있기 때문에 그것이 의심 스럽다. –

0

당신은에 의해 루프없이이 작업을 수행 할 수 있습니다 후

[hostFileOriginalArray release]; 

를 이동하려고 수정하기 전에 배열을 풀어줄한다 전화 걸기 [hostFileOriginalArray removeObjectIdenticalTo:@"Offending"];

문제가되는 오브젝트의 인스턴스가 여러 개 제거되지만 어쨌든 원하는 것처럼 보입니다. 또한 사용할 루프의 구현 세부 사항에 대해 걱정할 필요없이 빠른 방법으로 작업을 수행합니다.

일반적으로 (특히 컨테이너와 NSString과 같이 실제로 많이 사용되는 객체를 사용하는 경우) 클래스 참조를 확인하여 Apple에서 수행하려는 작업을 이미 수행하고 있는지 확인하십시오. 코드를 다른 코코아 사용자 (미래의 사용자 포함)에게 더 쉽게 읽을 수있게 해주 며, 코드 유지 관리가 줄어 듭니다. 이제 Fast Enumeration과 같은 새로운 기술을 코드에 추가하기 위해 Apple에 맡기고 링크하면 무료로 얻을 수 있습니다 새 버전의 SDK와 비교합니다.

또한 함수의 끝 부분에서 hostFileOriginalArray를 반환해야합니다. 그러면 자동 렌더링 된 객체로 반환 할 수있는 유용한 기능을 수행 할 수 있습니다.

+0

removeObjectIdenticalTo는 내가 수행 한 것과 매우 비슷하게 들립니다. 그러나 rangeOfString 내 위의 코드에서 않는 동일한 방식으로 일치하도록 얻을 수 없습니다. 아마도 추측 할 수 있듯이 코드는 변경되는 IP 주소와 별칭이 포함 된 hosts 파일을 편집하고 있습니다. rangeOfString이 할 수있게 해주는 전체 라인을 제거해야합니다. – Phill

+0

아, 그 부분 문자열로 @ "불쾌감"을 찾고 있다고보고 싶었습니다.NSPredicate를 구축하십시오. (아마도 [NSPredicate predicateWithBlock :]을 사용하여 @ "Offending"을 찾지 못하면 블록이 YES를 반환하거나 http://arstechnica.com/apple/guides/2009에서 찾을 수있는 문자열 일치를 사용하십시오. /04/cocoa-dev-the-joy-of-nspredicates-and-matching-strings.ars). – matthias

+0

실제로, 문제가되는 줄을 문자열에 저장 한 다음 removeObjectIdenticalTo를 사용하여 제거 할 수있었습니다. 다시 한 번 감사드립니다. – Phill

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

//Release the Array. 
[hostFileOriginalArray release]; 
당신이되었습니다 ... 점점 컴파일러 경고가 그들을 살펴보고, 그들은 일반적으로 매우 유용합니다

, 나는 항상 0 경고 ... 내가 부주의 짓을 한 내가 알고있는 방법이하려고합니다.