仪器声称内存泄漏[UIColor CGColor]

时间:2011-03-26 05:17:11

标签: ipad memory-management memory-leaks uicolor cgcolor

我正在使用Instruments跟踪一些内存泄漏。它声称我在drawRect方法中间泄漏。这是代码:

- (void)drawRect:(CGRect)rect {
    if (highColor && lowColor) {
        // Set the colors for the gradient to the two colors specified for high and low

        // The next line is allegedly leaking
        [gradientLayer setColors:[NSArray arrayWithObjects:(id)[highColor CGColor], (id)[lowColor CGColor], nil]]; 
        gradientLayer.startPoint = CGPointMake(0.5, 0.2);
    }

    [super drawRect:rect];
}

我在iPad上,所以我必须自己管理内存(也就是说,没有垃圾回收)。有谁能看到这里有什么问题?我的理解是我不必释放数组,也不必释放CGColors。此外,仪器中是否有任何方法可以找出泄漏的物体类型,即。是指NSArray还是CGColors?

非常感谢任何帮助。谢谢。

PS:几个月前我从某个地方获得了GradientView的代码;它工作得很好(除了暴露上述内存泄漏)。您可以找到代码here

编辑:

我做了一些研究并重构了我的代码如下:

- (void)drawRect:(CGRect)rect {
    if (highColor && lowColor) {
        // The following two lines are leaking
        CGColorRef highCGColor = [highColor CGColor];
        CGColorRef lowCGColor = [lowColor CGColor];

        // Set the colors for the gradient to the two colors specified for high and low
        [gradientLayer setColors:[NSArray arrayWithObjects:(id)highCGColor, (id)lowCGColor, nil]];
        gradientLayer.startPoint = CGPointMake(0.5, 0.2);

        CGColorRelease(highCGColor);
        CGColorRelease(lowCGColor);
    }

    [super drawRect:rect];
}

然而,我无法弄清楚为什么两个CGColors仍然在泄漏。我在方法结束时发布它们。 NSArray在解除分配时是否可能无法正确释放它们?仍然困惑......

3 个答案:

答案 0 :(得分:0)

我不是iphone / ipad上的内存管理专家,但我会这样做: 尝试在你的if中使用NSAutoreleasepool,然后池处理内存管理,所以你必须:

if...
NSAutoreleasePool *mypool=[[NSAutoreleasePool alloc]init];
...
[mypool drain];

尝试一下,看看是否还有泄漏,但记住不要删除你释放颜色的2行。

答案 1 :(得分:0)

你的UIView中如何声明highColor和lowColor?它们是否被适当释放/自动释放?您对gradientLayer对象的声明如何正确发布?这是我在一个阶段用来在UIView上创建渐变的一些代码。它不是使用图层,而是直接绘制到当前上下文中。也许它可能会有所帮助:

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGGradientRef myGradient;
    CGColorSpaceRef myColorSpace;
    size_t num_locations = 3;
    CGFloat locations[3] = {0.0, 0.5, 1.0};
    CGFloat components[12] = {0.855, 0.749, 0.196, 1.0,
                              0.973, 0.933, 0.267, 1.0,
                              0.855, 0.749, 0.196, 1.0};
    myColorSpace = CGColorSpaceCreateDeviceRGB();
    myGradient = CGGradientCreateWithColorComponents(myColorSpace, components, locations, num_locations);

    CGPoint myStartPoint, myEndPoint;
    myEndPoint.x = self.bounds.size.width;

    CGContextDrawLinearGradient(context, myGradient, myStartPoint, myEndPoint, 0);

    CGColorSpaceRelease(myColorSpace);
    CGGradientRelease(myGradient);
}

答案 2 :(得分:0)

你不应该发布highCGColor和lowCGColor。