1

在下面的函数中,我试图返回UIImage从创建的指针NSData

  1. 当我给出选项时,从这里返回 freeWhenDone = YES的显示是白色图像。UIImage
  2. 当我给出选项时freeWhenDone = NO

    • UIImage此处返回的表格将其显示为黑色图像。
    • 当我通过rgb_buffer(char array) 而不是[rgbData bytes]function1 和 function2 时正常工作。一切都很好。

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

1 回答 1

1

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.

于 2013-10-15T15:22:10.790 回答