gpt4 book ai didi

ios - NSData 即使被使用也会被释放

转载 作者:行者123 更新时间:2023-11-29 13:02:49 25 4
gpt4 key购买 nike

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

  1. 当我提供选项 freeWhenDone = YES 时,从此处返回的 UIImage 显示为白色图像。
  2. 当我给出选项时 freeWhenDone = NO

    • UIImage 返回的表单在这里显示为黑色图像。
    • 当我传递 rgb_buffer(字符数组)而不是 [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;
}

最佳答案

此代码存在一些问题。

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:...

至于崩溃,很可能是因为 Martin 引用的原因。如果您启用了 ARC,则您正在从 NSMutableData 实例中获取一个内部指针。 ARC无法将bytes的返回值与原始数据相关联,假定该数据对象不再被使用,并释放它。

要修复,添加:

[rgbData bytes] 就在 return outUIImage; 之前。这将使 ARC 知道在 function2:width:height:stride: 调用期间该对象正在使用中。

关于ios - NSData 即使被使用也会被释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19382535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com