Question

In below function I am trying to return UIImage pointer which is created from NSData

  1. When I give option freeWhenDone = YES the UIImage displayed returned from here is white image.
  2. When I give option freeWhenDone = NO

    • UIImage returned form here shows it as a black image.
    • When I pass rgb_buffer (char array) instead of [rgbData bytes] function1 and function2 work properly. Everything is fine.

Is it something to do with 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;
}
Was it helpful?

Solution

There are a handful of issues with this code.

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

That leaks the original malloc.

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

That method should be something like: function1:rgbBuffer:...

As for the crash, it is most likely for the reason Martin cites. If you have ARC enabled, you are grabbing an interior pointer from the NSMutableData instance. ARC can't associate the return value of bytes with the original data, assumes the data object is no longer being used, and releases it.

To fix, add:

[rgbData bytes] right before return outUIImage;. That will let ARC know that the object is in use through the duration of the function2:width:height:stride: call.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top