나는 CoreBluetooth를 통해 보낼 수 있도록 작은 < 크기의 청크로 NSData를 분할하려하지만 어떤 이유로 끔찍한 엉망으로 만들기로 결정했습니다. 데이터를 결합하고 객체를 디코딩하려는 사실에 의해 입증되었습니다. 같은 방법으로 실패합니다. 이 때문에 NSData를 잘못 나눕니다. 여기 NSData를 올바르게 분할하는 방법은 무엇입니까?
내가 그것을 분할하기 위해 사용하고 코드입니다// Split up the data and put into Array
NSUInteger length = [data length];
NSUInteger chunkSize = 100;
NSUInteger offset = 0;
do {
NSUInteger thisChunkSize = length - offset > chunkSize ? chunkSize : length - offset;
NSData* chunk = [NSData dataWithBytesNoCopy:(char *)[data bytes] + offset
length:thisChunkSize freeWhenDone:NO];
offset += thisChunkSize;
[orderQueue addObject:chunk];
} while (offset < length);
이 데이터는 다음 재결합 (! 유래에 어떤 종류의 낯선에서 가져온)와 객체는 너무 언 아카이브 :
NSMutableData *finishedData = [[NSMutableData alloc] init];
for (NSData *dataChunk in orderQueue) {
[finishedData appendData:dataChunk];
}
Order *order = [NSKeyedUnarchiver unarchiveObjectWithData:finishedData]; // ERRORS OUT ON THIS LINE
finishedData = [[NSMutableData alloc] init];
dataChunks = [[NSMutableArray alloc] init];
종이에, 나는 솔직히 내가 올바르게하고 있다고 생각하지만 가끔 버그가 나온다. 왜 이런 생각일까요? 이해할 수없는 아카이브 (0x62, 0x70, 0x6c, 0x69,에는 0x73, 따라 0x74 : - : [NSKeyedUnarchiver initForReadingWithData :] '* :
응용 프로그램을 종료* 인해 캐치되지 않는 예외'NSInvalidArgumentException ', 이유에 : < 나는 다음과 같은 오류가 발생합니다 , 0x30, 0x30) '
원본 NSData 객체가 언제든지 바이 바이로 갈 수 있으므로'dataWithBytesNoCopy' 사용에 대해 궁금합니다. 따라서 하나의 NSData 내부의 주소를 다른 NSData에 저장하면 첫 번째 NSData가 사라지고 무엇을 얻게됩니까? 쓰레기, 나는 의심한다. –
@HotLicks :'- [NSData bytes]'는'objc_inner_pointer'로 표시되어 있습니다 (http://lists.apple.com/archives/cocoa-dev/2012/May/msg00469.html). '데이터'는 '청크 (chunk)'만큼 오래 지속될 것입니다. –