2

好的。我会寻找答案,可能会自己找到。我有一个讨厌的习惯,就是回答自己的问题。

在任何情况下,我都有一个设计为相当容易“换肤”的应用程序。作为其中的一部分,我在一个特定于变体的静态类中隔离了方法。这些静态方法提供特定于变体的主要应用图像、颜色和设置。.h 文件对主应用程序是通用的,但 .m 文件是特定于变体的。

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

+ (UIColor *)meetingDetailBackgroundColor;

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

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

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

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

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

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

我确定我在这里做了一些奇怪的事情。我只是不确定是什么。

有任何想法吗?

顺便说一句:这是一个 ARC 程序,在 IOS 5 上运行。我是 ARC 的新手,但我认为这是我应该这样做的方式。

4

3 回答 3

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]让它成为背景。它在设备上运行得更快,并导致零内存泄漏。

于 2012-04-06T14:18:53.920 回答
3

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

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

它是线程安全的,并且只初始化一次颜色。这样,您就无法泄漏颜色。

于 2012-04-06T15:56:52.077 回答
0

好的。我解决了这个问题,但我没有解决它。

我踢了。

确实,Instruments 做出了疯狂的猜测。我指定颜色的方式没有任何问题(但是,我喜欢这里的一个建议,并以这种方式重新设置了我的颜色规范)。

这似乎是一个非常小的泄漏,埋在 MapKit 的深处(我的意思是字面意思)。我似乎完全无法解决它。

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

这会推迟泄漏,直到应用程序关闭。

我真是个懦夫。

谢谢。

于 2012-04-07T12:28:37.880 回答