Я работаю над перекодированием данных изображения из файла в кодировку base64, а затем обратно в байты, когда файл читается с использованием NSStream. Я думаю, что я почти там, но я продолжаю работать в EXC_BAD_ACCESS в разных точках во время преобразования.NSData dataWithBytesNoCopy от NSInputStream
Я довольно новичок в мире NSStream и буферов, поэтому не стесняйтесь сообщать мне, если я принимаю абсолютный неправильный подход здесь.
Вот что у меня до сих пор:
// Copy the bytes from our file input stream buffer
void *base64buffer = malloc(self.buffer[self.bufferOffset]);
// Convert the bytes to NSData for the base64 encode
NSData *dataToEncode = [NSData dataWithBytesNoCopy:base64buffer length:sizeof(base64buffer) freeWhenDone:YES];
// Convert our NSData into a base64 encoded string
NSString *base64EncodedData = [dataToEncode base64EncodedString];
// Convert our base64 encoded string back into NSData
NSData *encodedData = [base64EncodedData dataUsingEncoding:NSUTF8StringEncoding];
// Write the bytes to our output stream
bytesWritten = [self.producerStream write:[encodedData bytes] maxLength:[encodedData length]];
// Clean up
dataToEncode = nil;
base64EncodedData = nil;
encodedData = nil;
free(base64buffer);
Во-первых, malloc не копирует байты, он выделяет новую память, так что это огромная ошибка; во-вторых, ваш плохой доступ исходит от двойной бесплатной. Вы спросили, что NSData будет создано с помощью NoCopy, поэтому он использует ваш буфер памяти в качестве хранилища для поддержки, и вы устанавливаете freeWhenDone равным YES, поэтому, когда этот объект NSData уходит, он освобождает ваш буфер. Затем вы также бесплатно освобождаете свой буфер; либо установите это значение NO, либо не освободите base64buffer самостоятельно. –