4

我正在分析来自 SDK 的这段代码,并将错误类型基于我最新问题的答案:

iOS中如何正确释放内存:内存从不释放;指向的潜在内存泄漏

dasblinkenlight 建议我创建一个 NSData 对象,以便释放我的 uint8_t *bytes ...

但在这段代码中:

/**
 * this will set the brush texture for this view
 * by generating a default UIImage. the image is a
 * 20px radius circle with a feathered edge
 */
-(void) createDefaultBrushTexture{
    UIGraphicsBeginImageContext(CGSizeMake(64, 64));
    CGContextRef defBrushTextureContext = UIGraphicsGetCurrentContext();
    UIGraphicsPushContext(defBrushTextureContext);

    size_t num_locations = 3;
    CGFloat locations[3] = { 0.0, 0.8, 1.0 };
    CGFloat components[12] = { 1.0,1.0,1.0, 1.0,
        1.0,1.0,1.0, 1.0,
        1.0,1.0,1.0, 0.0 };
    CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();
    CGGradientRef myGradient = CGGradientCreateWithColorComponents (myColorspace, components, locations, num_locations);

    CGPoint myCentrePoint = CGPointMake(32, 32);
    float myRadius = 20;

    CGContextDrawRadialGradient (UIGraphicsGetCurrentContext(), myGradient, myCentrePoint,
                                 0, myCentrePoint, myRadius,
                                 kCGGradientDrawsAfterEndLocation);

    UIGraphicsPopContext();

    [self setBrushTexture:UIGraphicsGetImageFromCurrentImageContext()];

    UIGraphicsEndImageContext();
}

我在这些行上遇到了同样的错误:

存储到“myColorspace”中的对象的潜在泄漏

CGGradientRef myGradient = CGGradientCreateWithColorComponents (myColorspace, components, locations, num_locations);

存储到“myGradient”中的对象的潜在泄漏

UIGraphicsPopContext();

我试过:

free(myColorspace);
free(myGradient);

但我一直有同样的问题,我能做些什么来解决它

预先感谢您的所有支持

4

1 回答 1

15

听听错误告诉你什么。

“存储到的对象的潜在泄漏myColorspace

让我们看看色彩空间,看看我们是否能找到问题所在。myColorspace已创建CGColorSpaceCreateDeviceRGB,因此保留计数为 +1,但从未释放。这是不平衡的,需要在最后释放。我们需要添加一个CGColorSpaceRelease(myColorSpace);

“存储到的对象的潜在泄漏myGradient

同样的问题,使用保留计数 +1 创建,没有相应的发布。添加一个CGGradientRelease(myGradient);

不要在使用free框架Create函数创建的任何东西上使用。内部结构可能更复杂,并且 free 不会正确处理所有内存。使用相应的Release功能。

于 2013-08-06T18:59:55.177 回答