Cocoa:CALayer:连续重绘视图不断增加分配的内存

时间:2011-02-20 22:00:18

标签: cocoa memory calayer allocation redraw

我遇到内存分配问题(无论如何都没有泄漏)。

我的程序有一个自定义Window,其自定义View包含TextFieldImageViewShadow。 假设我每1秒使用TextField以编程方式更新[myTextField setStringValue:@"actual string"]的值。

显然,每次更改TextField时,都会重新绘制视图。

如果我查看Activity Monitor,我会看到每次更新TextField时,因此重绘了视图,分配的内存会增加。 ImageView不应该改变。 如果我用setStringValue注释该行,程序运行时根本不会增加内存。(参见更新4。)

请注意,Instruments不报告内存泄漏或未发布的对象,而视图为autorelease'd。

导致这种情况的原因是什么?

更新

我发布了实际代码的简化版本:

·H

CustomTextField *myTextField;
int level;

@interface Dummy : NSObject {

NSString *level_string;
NSTimer *timer;

}

@end

的.m

@implementation Dummy

- (void)awakeFromNib
{
// ...
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 
                                                  target:self 
                                                selector:@selector(changestring:) 
                                                userInfo:nil
                                                 repeats:YES];

// ...

}


-(void)changestring:(NSTimer *)timer
{
        level++;
        level_string = [[NSString alloc] initWithFormat:@"%i",level];
        [myTextField setStringValue:level_string];
        [level_string release];

}

其中CustomTextFieldNSTextField类。

我不知道我要添加的内容是否重要,无论如何定义了自定义窗口,自定义视图和自定义文本字段,并且在代码中以编程方式init并且它们未在界面中实例化助洗剂。

更新2

我错了!即使我发表评论setStringValue,记忆仍然会增加......少得多,但它仍然会增加...... 奇怪的事实是,无论如何,仪器报告的“活物体”大小保持不变,并且没有泄漏。

发生了什么事?

更新3

我刚刚使用了仪器的惊人快照功能,结果是this

我在活动监视器中看到的内存增加(几分钟后几千字节的数量级)来自何处?

更新4

我想我已找到导致问题的原因,但我无法解决。

View具有TextField,ImageView和Shadow。为了让它们在屏幕上正确显示而没有毛刺,我添加了[view setWantsLayer:YES]。 如果我评论这一行,内存分配问题肯定已经解决了。

现在,只要我需要使用该命令,我该怎么办?我是否应该发布与Core Animation相关的内容?请注意,与Core Animation相关的唯一一个命令是上面的命令。

2 个答案:

答案 0 :(得分:2)

查看WWDC10会话视频的会话311 - 使用乐器的高级内存分析。如何下载这些视频here

可能是您看到了遗弃的内存或者有一些缓存正在进行中。如果在模拟器中触发低内存警告会发生什么?记忆下来了吗?

还尝试使用Instruments的快照功能:制作快照,更新字符串并显示已创建的对象。在上面提到的会话视频中,演示了该过程。

编辑:我忘记了:如果你无法弄清楚发生了什么,你可以在一个简单的示例应用程序中触发低内存警告时显示增加内存分配而不释放内存分配的行为,请在{{ 3}}发送此示例项目和Instruments跟踪文件以显示正在进行的操作。

EDIT2:我错误地认为这个问题出现在Mac OS X上。同样的原则也适用于Mac OS X应用程序。 Cocoa中的内存管理在iPhone和Mac上几乎相同。最大的区别是在Mac上有可用的垃圾收集。当然在Mac上没有低内存警告,所以请不要这样做。

答案 1 :(得分:0)

CustomTextField中的setStringValue:我的猜测是你保留传递的字符串而不在你的setter中释放旧值。