【问题标题】:CGDataProviderCopyData leakCGDataProviderCopyData 泄漏
【发布时间】:2012-11-30 04:07:40
【问题描述】:

所以 xcode 工具告诉我下面的代码有泄漏

imageRef = [[_originalGridView image] CGImage];
_width = CGImageGetWidth(imageRef);
_height = CGImageGetHeight(imageRef);

//leak?
pixelData = (NSData*)CGDataProviderCopyData(CGImageGetDataProvider(imageRef));

rawData = (unsigned char*) [pixelData bytes];

问题是如果我尝试释放 pixelData 会崩溃,我在这里有点不知所措。有没有另一种方法可以做我目前正在做的事情,或者我应该释放我没有的东西。

编辑:对于所有说我应该发布像素数据的人,这是我尝试时会发生的情况

malloc: * 对象 0x547b000 的错误:未分配被释放的指针 * 在 malloc_error_break 中设置断点进行调试

【问题讨论】:

  • 您如何以及在何处发布pixelData,因为您拥有它,而且它 泄露核心基础类型。
  • 没有,因为如果我在任何地方调用 release 就会崩溃

标签: ios memory-management


【解决方案1】:

我认为您需要先保留rawData,然后您可以使用CFRelease(pixelData) 释放pixelData 使用后别忘了释放rawData

【讨论】:

  • 我在函数后面的某处释放 rawData...但是你的意思是我应该保留 rawdata 然后释放 pixeldata 然后释放 rawdata?那么我是否不需要对原始数据进行两次发布调用?在我使用免费(rawData)的那一刻;它不会崩溃或抱怨......但你所说的要点是我需要在发布 rawdata 之前释放 pixelData?
【解决方案2】:

在转换之前创建CGDataRef数据的副本,然后转换为NSData, 完成对您拥有的 CGDataRef 副本的处理后,然后像这样发布副本。

     CFDataRef theData; 
    theData = CGDataProviderCopyData(CGImageGetDataProvider(imageRef));
// caste 
    NSData *data = (__bridge NSData *)theData; 

    //.. do some stuff 

    //Releaase data 

    CFRelease(theData);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-27
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多