2013-10-15 3 views
3

Я пытаюсь написать код для создания NSMutableData из malloced buffer.I используется freewhendone = ДА
1) Это дает ошибку в доступе буфера после NSData создаются. (В MemSet ниже в коде)
2) Указатель буфера malloced и указатель [data bytes] отличаются.проблем с NSMutabledata byteswithnocopy

Есть ли какие-либо объяснения для этого?

UWORD8 *rgb_buffer = malloc(u4_stride * u4_height * 3); 

NSMutableData *rgbData = [NSMutableData dataWithBytesNoCopy:rgb_buffer 

                length:(u4_stride * u4_height * 3) 

               freeWhenDone:YES]; 
memset(rgb_buffer, 0, (u4_stride * u4_height * 3)); 
+0

Вероятно, вы работаете в ARC и не используете объект rgbData после memset; следовательно, он может рано высвобождать объект и, таким образом, освобождать rgb_buffer. См. Http://blog.bignerdranch.com/296-arc-gotcha-unexpectedly-short-lifetimes/ – iccir

ответ

3

Binary Data Programming Guide От

NSMutableData реагирует на dataWithBytesNoCopy: длина :, но байты копируются в любом случае, и буфер освобождается немедленно.

Это дает ошибку в доступе буфер после NSData создается. (В MemSet ниже в коде)

буфер освобождается немедленно.

Указатель буфера и указатель [data bytes] отличаются друг от друга.

NSMutableData создать копию байтов.

+0

'Если вы предпочитаете, чтобы байты не копировались или не освобождались при выпуске объекта, вы можете использовать dataWithBytesNoCopy: length: freeWhenDone: или initWithBytesNoCopy: length: freeWhenDone: методы передают NO как freeWhenDone: argument.' Это говорит о том, что использование этого метода байты не должны копироваться. Когда я пробую это с freewhendone = NO memset не дает segfault, но указатели все еще разные. –

+1

NSMutableData также отвечает на эти методы, но байты все равно копируются, и буфер немедленно освобождается. –

Смежные вопросы