【问题标题】:Instrument still complain about memory leak after releasingInstrument 释放后仍报内存泄漏
【发布时间】:2017-06-28 22:07:58
【问题描述】:

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

    - (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

感谢任何帮助。

【问题讨论】:

  • 您在使用 ARC 吗?还是手动释放? (如果是后者,你能说明你在哪里做吗?)
  • 我相信我正在使用 ARC
  • 谢谢,我可能会看看如何使用静态分析器@Rob
  • 如果你使用 arc 那么你不需要分配或删除内存,它已经为你完成了。但如果你不是,那么你需要释放每一个东西,有点像在C 编码中你必须使用malloc 和free。无论如何,@Rob 是正确的,静态分析器经常使用,所以你现在应该使用他的建议:D
  • 顺便说一句,在未来,您可以斩钉截铁并使用CAGradientLayer,这样您就无需手动管理所有这些CoreFoundation 内存引用。但是,如果以上内容准确地代表了正在泄漏的代码,那么它可能没有实际意义,因为我怀疑泄漏仍然存在于其他地方。

标签: ios objective-c memory-leaks


【解决方案1】:

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

这里有一个问题,你过度释放了colorRef,因为NSArray 和ARC 应该为你管理那个数组。但这是一个过度发布,而不是泄漏。 [此引用的违规代码已被编辑为不可能。]

【讨论】:

  • 谢谢,我刚刚更新了代码,我用UIGraphicsGetCurrentContext检索上下文,根据create and get规则,我们不必释放它,对吧?
  • 正确。既然您已经更新了问题,我已经删除了答案的那部分,向我们展示了 context 是如何定义的。您只需手动释放您使用名称中带有Create 或Copy 的函数创建的那些项目。
  • 发布顺序重要吗?还是我必须先释放一个依赖?
  • 我不认为顺序很重要(尽管出于习惯,我通常按照创建它们的相反顺序进行操作,实际上是 LIFO,后进先出)。
  • @KesongXie - 我刚刚通过 Instruments Allocations/Leaks 以及静态分析器运行了上面的代码(只用普通的 UIColor 和 CGFloat 代码替换你的 CNV 东西)并没有看到报告泄漏。视图或视图控制器是否有可能泄漏(因此与该视图相关的所有内容都会泄漏)? (仅供参考,调试内存图功能擅长查找强引用循环等。)我建议您创建一个独立的空白项目来显示您描述的问题,然后与我们分享。在重现问题之前,我们无能为力。
猜你喜欢
  • 2011-12-05
  • 1970-01-01
  • 2012-06-08
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
相关资源
最近更新 更多