2013-10-15 3 views
1

В ниже функции Я пытаюсь вернуть UIImage указатель, который создается из NSDataNSData получения освободило Eventhough его использовал

  1. Когда я даю вариант freeWhenDone = YESUIImage отображается вернулся отсюда белое изображение.
  2. Когда я даю опцию freeWhenDone = NO

    • UIImage вернулся форму здесь показывает, как черное изображение.
    • Когда я передаю rgb_buffer (массив символов) вместо [rgbData bytes] функция1 и функция2 работают правильно. Все отлично.

ли что-то сделать с ARC?

Myfunction 
{ 
    char *pu1_out_buffer = malloc(length); 
    int width, height, stride; 
    char *rgb_buffer = malloc(BUFFER_LENGTH); 
pu1_out_buffer = datafromfile(FILE_PATH) // initialized with some data , not important 

/* rgb NSdata created from malloced rub buffer */ 
    NSMutableData *rgbData = [NSMutableData dataWithBytesNoCopy:rgb_buffer 
                length:(u4_stride * u4_height * 3) 
               freeWhenDone:YES]; 
[self function1:pu1_out_buffer 
      rgb_buffer:(UWORD16 *)[rgbData bytes] 
         …] 

    free(pu1_out_buffer); 
    UIImage *outUIImage = [self function2:rgbData   
             width:u4_width 
             height:u4_height 
             stride:u4_stride]; 

    return outUIImage; 
} 
+0

Из любопытства: зачем вам нужно использовать динамическое распределение памяти (malloc's)? –

+1

Невозможно ответить, почему ваше изображение является белым или черным, не зная 'function1',' function2'. –

+0

Несвязанный, но 'pu1_out_buffer = datafromfile (FILE_PATH)' = недопустимый синтаксис и утечка памяти. 'MyFunction {' также недействителен, если только макрос, пожалуйста, отправьте реальный пример. – Joe

ответ

1

Существует несколько проблем с этим кодом.

char *pu1_out_buffer = malloc(length); 
pu1_out_buffer = datafromfile(FILE_PATH) // initialized with some data , not important 

Это утечка оригинала malloc.

[self function1:pu1_out_buffer 
     rgb_buffer:(UWORD16 *)[rgbData bytes] 
        …] 

Этот метод должен быть что-то вроде: function1:rgbBuffer: ...

Что касается аварии, то, скорее всего, по той причине, Мартин ссылается. Если у вас включен ARC, вы захватываете указатель интервала с примера NSMutableData. ARC не может связать возвращаемое значение bytes с исходными данными, предполагает, что объект данных больше не используется и освобождает его.

Чтобы исправить, добавить:

[rgbData bytes] прямо перед return outUIImage;. Это позволит ARC знать, что объект используется в течение всего времени вызова function2:width:height:stride:.