appendData
메서드를 사용하여 쉽게 NSMutableData 인스턴스에 바이트를 추가 할 수 있지만 데이터를 제거하는 비슷한 방법이 표시되지 않습니까? 뭔가를 내려다 보지 않습니까, 아니면 새로운 객체를 만들고 필요한 바이트 만 복사해야합니까? NSMutableData 이후NSMutableData에서 바이트를 제거 하시겠습니까?
답변
는 다음과 같은 방법의 설명서를 참조하십시오
사용, 끝에서 10 바이트를 제거하려면 다음범위의 길이가 replacementLength 동일하지 않은 경우, 수신기는 가 크기 조정입니다 새로운 바이트를 수용합니다. 의 범위를 벗어난 바이트는 새로운 바이트를 수용 할 수 있도록 이동됩니다. 따라서 replacementBytes에 대해서는 NULL을, replacementLength에 대해서는 0을 사용하여 범위 범위의 수신기 의 바이트를 삭제할 수 있습니다. 은 길이가바이트보다 더 많은 바이트 (예 : "바꾸기 및 추가 삽입")의 범위를 바꿀 수 있습니다.
[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 객체를 다루지 않는 한 일반적으로 충분히 빠릅니다.
당신이 CFDataDeleteBytes을 사용할 수 있습니다, 무료 CFMutableDataRef와 다리() 함수와 : 제거 할 데이터의 끝에있는 경우
이NSMutableData *data = ...
CFDataDeleteBytes((CFMutableDataRef)data, CFRangeMake(3, 4));
주의하십시오. 이 경로 아래로 성능 문제가 있습니다. 비교적 적은 시간 동안 편집하거나 작은 데이터로 작업하는 경우 별다른 문제가 발생하지 않습니다. 크거나 빈번하거나 성능에 민감한 것이 든 어떤 유형의 최적화 된 데이터 구조 사용을 고려하십시오. – bbum
감사합니다. NSMutable 데이터가 CFMutableDataRef와 '수신자 부담 브리지'인지 어떻게 알 수 있습니까? 이 NSMutableData 워드 프로세서 언급이 보이지 않는다? – Kyle
NSMutableData 문서의 "개요"섹션을 보면 http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Reference/Foundation/Classes/NSMutableData_Class/Reference/NSMutableData.html이 표시됩니다. 두 번째 단락에서 언급 한 것 –
, 당신은
[NSMutableDataInstance setLength:[NSMutableDataInstance length] - n];
을 사용할 수 있습니다
또는 OBJ-C 2.0 구문
NSMutableDataInstance.length -= n;
은 원시 데이터를 조작하는 것이 좋습니다. 다음
- (void)replaceBytesInRange:(NSRange)range withBytes:(const void *)replacementBytes length:(NSUInteger)replacementLength
애플이 분명하게 말한다 :
팁 주셔서 감사! 나는 그러나 전면에서 제거하려고 오전 : – Kyle
이 스레드는 대답을 가지고 있지만, 그럼에도 불구하고 이것은 가치있는 추가가 될 수 있습니다. NSMuttableData에서 모든 바이트를 제거하려면 새 데이터를 만들어 원본으로 복사하십시오.
[myData setData:[NSData dataWithBytes:NULL length:0]];
위대한 작품입니다.
- 1. 처음 16 바이트를 제거 하시겠습니까?
- 2. NSMutableData에서 내용을 지우는 방법
- 3. NSMutableData에서 NSInputStream을 읽어 NSStreamEventEndEncountered 신호를 보내는 방법
- 4. 바이트를 16 진수로 비교 하시겠습니까?
- 5. 리버스 엔디안에서 바이트를 읽도록이 코드를 수정 하시겠습니까?
- 6. 파일에서 단일 바이트를 어떻게 변경 하시겠습니까?
- 7. NSMutableData에서 바이트 조작 문제 - 웨이브 헤더 정보
- 8. document.write를 제거 하시겠습니까?
- 9. 텍스트에서 태그를 제거 하시겠습니까?
- 10. 단순히 커브를 제거 하시겠습니까?
- 11. View에서 subView를 제거 하시겠습니까?
- 12. TabHost - 그림자를 제거 하시겠습니까?
- 13. ListBox에서 항목을 제거 하시겠습니까?
- 14. JScrollBar, keyListener를 제거 하시겠습니까?
- 15. 동적으로 NewApplication을 제거 하시겠습니까?
- 16. 시스템 서비스를 제거 하시겠습니까?
- 17. 배열에서 값을 제거 하시겠습니까?
- 18. 코드가있는 DataSourceID를 제거 하시겠습니까?
- 19. TabControl에서 거터를 제거 하시겠습니까?
- 20. IOS, 경고를 제거 하시겠습니까?
- 21. 제거 하시겠습니까? htaccess로
- 22. jQuery ::: 정말로 제거 하시겠습니까?
- 23. PHP를 교체하고 제거 하시겠습니까?
- 24. ArrayList에서 객체를 제거 하시겠습니까?
- 25. 어떻게하면 큰 파일의 중간에서 바이트를 삽입하거나 제거 할 수 있습니까?
- 26. 바이트를 읽음
- 27. HTML 콘텐츠의 공백을 제거 하시겠습니까?
- 28. 문자열에서 숫자를 제거 하시겠습니까? 문자열에서
- 29. Qt - 메뉴를 아래에서 제거 하시겠습니까?
- 30. Vim에서 중복 줄을 제거 하시겠습니까?
이것은 좋은 답변입니다, 그것은 방법이 덜 upvotes 있고 지금은 무의미한 답변 파생이야. 독립형 답변이되도록 수정해야할까요? +1 –
@ Yar : 물론 그렇습니다. 다른 답변에 대한 참조를 삭제했습니다. – Mecki
어쨌든 오늘이 대답으로 돌아가서 "찾고있는 범위 (길이가 0 일 수도 있음)를 삽입의 효과가있는 범위의 길이보다 많은 바이트로 바꿀 수 있습니다 (또는" 더 삽입 ")." 접선이지만 관련성이 있습니다. 감사! –