Ios 释放后,仪器仍抱怨内存泄漏

Ios 释放后,仪器仍抱怨内存泄漏,ios,objective-c,memory-leaks,Ios,Objective C,Memory Leaks,我有以下创建和释放对象的方法,但仪器仍在抱怨内存泄漏。所有可能泄漏的物体都已释放。我不确定释放的顺序是否重要 - (void)drawRect:(CGRect)rect { // Drawing code // drawing the gradiant from left to right and from green to yellow to red // the position of yellow should be UIColor *greenCo

我有以下创建和释放对象的方法,但仪器仍在抱怨内存泄漏。所有可能泄漏的物体都已释放。我不确定释放的顺序是否重要

    - (void)drawRect:(CGRect)rect {
    // Drawing code
    // drawing the gradiant from left to right and from green to yellow to red
    // the position of yellow should be
    UIColor *greenColor = [CNVColorUtils colorWithHexString:@"#09c961"];
    UIColor *redColor = [CNVColorUtils colorWithHexString:@"#ff3431"];
    UIColor *neutralColor = [CNVColorUtils colorWithHexString:@"#fff00c"];

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGFloat greenEnd = self.positivePercentage ?: kCNVSentimentsBarMinPersentage;
    CGFloat yellowEnd = greenEnd + self.neutralPercentage ?: kCNVSentimentsBarMinPersentage;

    CGFloat firstGradientStart = MAX(0, greenEnd - kCNVSentimentsBarTransactionPercentage);
    CGFloat firstGradientEnd = MIN(yellowEnd, greenEnd + kCNVSentimentsBarTransactionPercentage);

    CGFloat secondGradientStart = MAX(greenEnd, yellowEnd - kCNVSentimentsBarTransactionPercentage);
    CGFloat secondGradientEnd = MIN(1.0, yellowEnd + kCNVSentimentsBarTransactionPercentage);

    NSArray *colors = @[(id)greenColor.CGColor, (id)greenColor.CGColor, (id)neutralColor.CGColor, (id)neutralColor.CGColor, (id)redColor.CGColor,(id)redColor.CGColor];

    CGFloat locations[6] = {0.0, firstGradientStart, firstGradientEnd, secondGradientStart, secondGradientEnd, 1.0};

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (CFArrayRef)colors, locations);
    CGContextDrawLinearGradient(context, gradient, CGPointMake(0.0, 0.0), CGPointMake(CGRectGetMaxX(self.frame), 0.0), 0);

    CGColorSpaceRelease(colorSpace);
    CGGradientRelease(gradient);

}
仪器投诉泄漏对象为
CGGradient


非常感谢您的帮助。

通过静态分析器运行代码(命令+shift+B或Xcode的“产品”菜单上的“分析”)。它非常善于发现这类问题。但我没有看到上述代码中有任何明显的漏洞


但是,这里有一个问题,您正在过度删除
colorRef
,因为
NSArray
和ARC应该为您管理该数组。但这是过度释放,而不是泄漏。[此引用的有问题的代码已被删除。]

是否使用ARC?还是手动释放?(如果是后者,你能告诉我你在哪里这样做吗?)我在使用ARC,我相信谢谢,我可能会看看如何使用static analyzer@rob如果你在使用ARC,那么你不需要分配或删除内存,这是为你做的。但是如果你没有,那么你需要释放每一件东西,就像在
C
编码中,你必须使用
malloc
free
一样。不管怎样,@Rob说的静态分析器通常是正确的,所以你现在应该考虑他的建议:撇开dasan不谈,将来你可以省去麻烦,使用a,这样你就不用手动管理所有这些CoreFoundation内存引用了。但是,如果上面的代码准确地表示了泄漏的代码,那么这可能是没有意义的,因为我怀疑泄漏在其他地方。谢谢,我刚刚更新了代码,我使用UIGraphicsGetCurrentContext检索了上下文,根据创建和获取规则,我们不必发布它,对吗?正确。既然您已经更新了问题,我已经删除了答案的这一部分,向我们展示了
context
是如何定义的。您只需手动释放那些使用函数创建的项目,这些函数的名称中包含
Create
Copy
。释放顺序是否重要?或者这是我必须先释放的依赖关系吗?我不相信顺序是重要的(尽管作为一种习惯,我通常按照与创建顺序相反的顺序来做,有效的是后进先出)。@KesongXie-我只是通过仪器分配/泄漏以及静态分析器来运行上述代码(仅将您的
CNV
内容替换为普通
UIColor
CGFloat
代码),并且未发现任何泄漏报告。视图或视图控制器是否可能泄漏(因此与该视图相关的所有内容都会泄漏)?(仅供参考,调试内存图功能擅长查找强引用周期等。)我建议您创建一个独立的空白项目,显示您描述的问题,然后与我们共享。在重现该问题之前,我们无法提供帮助。