NSData освобождается, хотя он используется

В приведенной ниже функции я пытаюсь вернуть указатель UIImage, созданный из NSData.

  1. Когда я даю опцию freeWhenDone = YES, отображаемое UIImage возвращается отсюда, это белое изображение.
  2. Когда я даю вариант freeWhenDone = NO

    • UIImage returned form here shows it as a black image.
    • Когда я передаю rgb_buffer (массив символов) вместо [rgbData bytes] function1 и function2 работают правильно. Все хорошо.

Это как-то связано с АРК?

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;
}

person thar_bun    schedule 15.10.2013    source источник
comment
Из любопытства: зачем вам нужно использовать динамическое выделение памяти (malloc)?   -  person Arek Holko    schedule 15.10.2013
comment
Невозможно ответить, почему ваше изображение белое или черное, не зная function1, function2.   -  person Martin R    schedule 15.10.2013
comment
Не связано, но pu1_out_buffer = datafromfile(FILE_PATH) = неверный синтаксис и утечка памяти. MyFunction { также недействителен, если не макрос, опубликуйте реальный пример.   -  person Joe    schedule 15.10.2013
comment
Кроме того, зачем вам malloc размер BUFFER_LENGTH, но солгать NSMutableData и сказать ему (u4_stride * u4_height * 3)?   -  person Joe    schedule 15.10.2013
comment
rgb_buffer освобождается, что было объяснено в вашем предыдущем вопросе вопросов/19380363/ или его возможного дубликата stackoverflow.com/questions/18770265/. Так что вряд ли использование rgb_buffer вместо [rgbData bytes] работает лучше.   -  person Martin R    schedule 15.10.2013


Ответы (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:.

person bbum    schedule 15.10.2013