【问题标题】:NSData getting freed eventhough its usedNSData 被释放,即使它被使用
【发布时间】:2013-10-15 13:30:19
【问题描述】:

在下面的函数中,我试图返回由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;
}

【问题讨论】:

  • 出于好奇:为什么需要使用动态内存分配(malloc's)?
  • 如果不知道function1function2,就无法回答为什么您的图像是白色或黑色。
  • 不相关但pu1_out_buffer = datafromfile(FILE_PATH) = 无效语法和内存泄漏。 MyFunction {也是无效的,除非是宏,请发个实例。
  • 还有,你为什么要mallocBUFFER_LENGTH 一样大,却骗NSMutableData 告诉它(u4_stride * u4_height * 3)
  • rgb_buffer 已被释放,这已在您之前的问题stackoverflow.com/questions/19380363/… 或其可能重复的stackoverflow.com/questions/18770265/… 中进行了解释。因此,使用rgb_buffer 代替[rgbData bytes] 不太可能“更好”。

标签: ios objective-c uiimage nsdata nsmutabledata


【解决方案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:...

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

要修复,请添加:

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

【讨论】:

    猜你喜欢
    • 2011-09-23
    • 2014-04-24
    • 1970-01-01
    • 2011-06-25
    • 2011-05-20
    • 1970-01-01
    • 2012-01-19
    • 2013-05-24
    • 2011-12-17
    相关资源
    最近更新 更多