IOS:使用模式图像作为背景 - 内存泄漏

时间:2012-04-06 11:50:42

标签: iphone ios uiimage memory-leaks cgimage

行。我会寻找答案,也可以自己找。我有回答自己问题的恶习。

无论如何,我的应用程序设计为相当容易“蒙皮”。作为其中的一部分,我在静态类中隔离了特定于变体的方法。这些静态方法提供特定于变体的主应用程序图像,颜色和设置。 .h文件对于主应用程序是通用的,但.m文件特定于变体。

我喜欢使用能够将图像作为背景发送(自动平铺),因此接口文件将例程指定为返回UIColor,如下所示:

+ (UIColor *)meetingDetailBackgroundColor;

但是实现文件会加载一个图像文件,并返回它,如下所示:

+ (UIColor *)meetingDetailBackgroundColor
{
    return [UIColor colorWithPatternImage:[UIImage imageNamed:@"DarkWeave.png"]];
}

在上下文中使用,如下所示:

[[self view] setBackgroundColor:[BMLTVariantDefs meetingDetailBackgroundColor]];

注意:已编辑以恢复我使用的原始简单代码。

现在,问题在于我有时(并非总是)会泄漏。

我确信我在这里做些什么事。我只是不确定是什么。

有什么想法吗?

BTW:这是一个在IOS 5上运行的ARC程序。我是ARC的新手,但我认为这是我应该这样做的。

3 个答案:

答案 0 :(得分:7)

UIColor colorWithPatternImage有错误,不要使用它。我的经验是,它往往会严重削弱设备的性能,但不会削弱模拟器的性能。像滚动或动画一样的东西往往会变慢。我不确定这是否真的有资格作为泄漏,我没有看到App被杀,因为RAM耗尽。但是,如果您对该应用进行了分析,您会看到该应用在启用UIColor colorWithPatternImage并且绘制内容时运行得慢得多。

最终我创建了UIView的子类,并执行了类似的操作:

- (void)drawRect:(CGRect)rect
{
    CGContextRef c = UIGraphicsGetCurrentContext();
    CGContextSetBlendMode(c, kCGBlendModeCopy);
    CGContextDrawTiledImage(c, CGRectMake(0, 0, bkgnd.size.width, bkgnd.size.height), bkgnd.CGImage);
}

这将平铺图像。然后,我使用self.tableView.backgroundView[self.view insertSubview:bkgnd atIndex:0]将其作为背景。它在设备上运行得更快,并且导致零内存泄漏。

答案 1 :(得分:3)

初始化共享颜色的最佳方法是:

+ (UIColor *)color
{
    static UIColor *color;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        color = [[UIColor alloc] init...];
    });
    return color;
}

它是线程安全的,只能初始化一次颜色。这样就没有办法让你泄漏颜色。

答案 2 :(得分:0)

行。我解决了这个,但我没有修复它。

我很鄙视。

事实上,仪器正在做出疯狂的猜测。我指定颜色的方式没有错(但是,我喜欢这里的一个建议,并以这种方式重新设置颜色规格)。

这似乎是一个非常小的泄漏,埋在MapKit的肠道深处(我的意思是字面意思)。我似乎无能为力解决它。

经过几个小时的砖墙/新皮质交互,我只是放弃了,并使屏幕控制器对象可重复使用。我只是把它挂在身边,并改变内容以适应正在检查的会议。

在应用关闭之前推迟泄漏。

我是个懦夫。

感谢。