2010-02-27 7 views
26

appendData 메서드를 사용하여 쉽게 NSMutableData 인스턴스에 바이트를 추가 할 수 있지만 데이터를 제거하는 비슷한 방법이 표시되지 않습니까? 뭔가를 내려다 보지 않습니까, 아니면 새로운 객체를 만들고 필요한 바이트 만 복사해야합니까? NSMutableData 이후NSMutableData에서 바이트를 제거 하시겠습니까?

답변

71

는 다음과 같은 방법의 설명서를 참조하십시오

범위의 길이가 replacementLength 동일하지 않은 경우, 수신기는 가 크기 조정입니다 새로운 바이트를 수용합니다. 의 범위를 벗어난 바이트는 새로운 바이트를 수용 할 수 있도록 이동됩니다. 따라서 replacementBytes에 대해서는 NULL을, replacementLength에 대해서는 0을 사용하여 범위 범위의 수신기 의 바이트를 삭제할 수 있습니다. 은 길이가바이트보다 더 많은 바이트 (예 : "바꾸기 및 추가 삽입")의 범위를 바꿀 수 있습니다.

사용, 끝에서 10 바이트를 제거하려면 다음

[data setLength:[data length] - 10]; 

또한 replaceBytesInRange 통해 수행 할 수 있지만 바이트가 실제로 제거되지 않습니다 있기 때문에, 실제로는 훨씬 더 빠릅니다. 대신 내부 크기 변수 만 변경되고 NSMutableData는 바이트가 제거 된 것처럼 동작합니다. IOW, 이것은 O (1) 연산입니다 (즉, 제거하는 바이트 수에 관계없이 수행하는 데 시간이 오래 걸릴 것임을 의미). 매우 빠릅니다.

, 정면에서 10 바이트를 제거하기 위해 사용

[data replaceBytesInRange:NSMakeRange(0, 10) withBytes:NULL length:0]; 

중간 (예 후 20 바이트) 사용시에 10 바이트 제거 방법

[data replaceBytesInRange:NSMakeRange(20, 10) withBytes:NULL length:0]; 

replaceBytesInRange가 O 인 (N) 그래도 작동. 즉, 100 바이트를 제거하는 데 시간이 오래 걸리더라도 200 바이트를 제거하는 데 2 ​​배의 시간이 소요됩니다. 그것은 여전히 ​​매우 빠르고 컴퓨터의 메모리 (RAM) 처리량에 의해서만 제한됩니다. 10MB의 데이터가 있고 전면에서 1MB를 제거하면 방금 제거 된 MB의 틈을 메우기 위해 9MB가 복사됩니다. 따라서 작업 속도는 시스템이 얼마나 빨리 하나의 주소에서 다른 주소로 9MB의 RAM을 이동할 수 있는지에 달려 있습니다.수백 MB가 포함 된 NSMutableData 객체를 다루지 않는 한 일반적으로 충분히 빠릅니다.

+0

이것은 좋은 답변입니다, 그것은 방법이 덜 upvotes 있고 지금은 무의미한 답변 파생이야. 독립형 답변이되도록 수정해야할까요? +1 –

+1

@ Yar : 물론 그렇습니다. 다른 답변에 대한 참조를 삭제했습니다. – Mecki

+0

어쨌든 오늘이 대답으로 돌아가서 "찾고있는 범위 (길이가 0 일 수도 있음)를 삽입의 효과가있는 범위의 길이보다 많은 바이트로 바꿀 수 있습니다 (또는" 더 삽입 ")." 접선이지만 관련성이 있습니다. 감사! –

3

당신이 CFDataDeleteBytes을 사용할 수 있습니다, 무료 CFMutableDataRef와 다리() 함수와 : 제거 할 데이터의 끝에있는 경우

NSMutableData *data = ... 
CFDataDeleteBytes((CFMutableDataRef)data, CFRangeMake(3, 4)); 
+3

주의하십시오. 이 경로 아래로 성능 문제가 있습니다. 비교적 적은 시간 동안 편집하거나 작은 데이터로 작업하는 경우 별다른 문제가 발생하지 않습니다. 크거나 빈번하거나 성능에 민감한 것이 든 어떤 유형의 최적화 된 데이터 구조 사용을 고려하십시오. – bbum

+0

감사합니다. NSMutable 데이터가 CFMutableDataRef와 '수신자 부담 브리지'인지 어떻게 알 수 있습니까? 이 NSMutableData 워드 프로세서 언급이 보이지 않는다? – Kyle

+0

NSMutableData 문서의 "개요"섹션을 보면 http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Reference/Foundation/Classes/NSMutableData_Class/Reference/NSMutableData.html이 표시됩니다. 두 번째 단락에서 언급 한 것 –

1

, 당신은

[NSMutableDataInstance setLength:[NSMutableDataInstance length] - n];을 사용할 수 있습니다

또는 OBJ-C 2.0 구문

NSMutableDataInstance.length -= n; 

은 원시 데이터를 조작하는 것이 좋습니다. 다음

- (void)replaceBytesInRange:(NSRange)range withBytes:(const void *)replacementBytes length:(NSUInteger)replacementLength 

애플이 분명하게 말한다 :

+0

팁 주셔서 감사! 나는 그러나 전면에서 제거하려고 오전 : – Kyle

0

이 스레드는 대답을 가지고 있지만, 그럼에도 불구하고 이것은 가치있는 추가가 될 수 있습니다. NSMuttableData에서 모든 바이트를 제거하려면 새 데이터를 만들어 원본으로 복사하십시오.

[myData setData:[NSData dataWithBytes:NULL length:0]]; 

위대한 작품입니다.

관련 문제