gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:43:42 25 4
gpt4 key购买 nike

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

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

显然,每次 TextField 发生更改时, View 都会重新绘制。

如果我查看事件监视器,我会发现每次更新 TextField 并因此重新绘制 View 时,分配的内存都会增加。 ImageView 不应该改变。 如果我用 setStringValue 注释该行,则程序运行时根本不会增加内存。 (请参阅更新 4。)

请注意,Instruments 不会报告内存泄漏或未释放的对象,并且 View 会自动释放

什么原因会导致这种情况?

更新

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

.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];

}

其中 CustomTextField 是一个 NSTextField 类。

我不知道我要添加的内容是否重要,无论如何,自定义窗口、自定义 View 和自定义文本字段都是在代码中以编程方式定义和初始化的,但它们不是在界面生成器中实例化。

更新2

我错了!即使我评论 setStringValue 内存仍然增加..少很多,但它仍然增加..奇怪的事实是,无论如何,仪器都会报告“事件对象”的大小,该大小保持不变并且没有报告泄漏。

发生了什么?

更新3

我刚刚使用了 Instruments 令人惊叹的 heapshots 功能和 this就是结果。

我在事件监视器中看到的内存增加(几分钟后达到数千字节的量级)来自哪里?

更新4

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

View 有一个 TextField、一个 ImageView 和一个 Shadow。为了使它们正确显示在屏幕上而不会出现故障,我添加了 [view setWantsLayer:YES]。如果我注释掉这一行,内存分配问题肯定就解决了。

现在,只要我需要使用该命令,我该怎么办?我应该发布一些与核心动画相关的东西吗?请注意,与核心动画相关的唯一一个命令是上面的命令。

最佳答案

观看 WWDC10 session 视频的 session 311 - 使用仪器进行高级内存分析。如何下载这些视频可以找到here

您可能看到废弃的内存或者正在进行一些缓存。如果在模拟器中触发内存不足警告,会发生什么情况?内存下降了吗?

还可以尝试使用 Instruments 的堆快照功能:进行堆快照、更新字符串并显示已创建的对象。在上面提到的 session 视频中演示了该过程。

编辑:我忘记了什么:如果您无法弄清楚发生了什么,并且您可以显示增加内存分配而不释放它的行为,如果在简单的示例应用程序中触发低内存警告,请在 Apple's bugreporter 发送错误在此示例项目和 Instruments 跟踪文件中以显示正在发生的情况。

EDIT2:我错误地认为这个问题是在 Mac OS X 上。同样的原理也适用于 Mac OS X 应用程序。 Cocoa 中的内存管理在 iPhone 和 Mac 上几乎相同。最大的区别是 Mac 上有垃圾收集功能。当然,在 Mac 上没有内存不足警告,因此请忽略它。

关于Cocoa:CALayer: View 的连续重绘不断增加分配的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5060372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com