0

我有内存分配问题(无论如何都不会泄漏)。

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

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

如果我查看活动监视器,我会看到每次更新 TextField 时,都会重绘视图,分配的内存会增加。ImageView 不应该改变。 如果我用 注释该行setStringValue,则程序运行时根本不会增加内存。(见更新 4。)

请注意,Instruments不报告内存泄漏或未释放的对象,并且 View 是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

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

我在活动监视器中看到的内存增加(几分钟后大约为数千字节)来自哪里?

更新 4

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

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

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

4

2 回答 2

2

观看session 311 - Advanced Memory Analysis with Instruments of WWDC10 session 视频。如何下载这些视频可以在这里找到。

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

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

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

EDIT2:假设这个问题出现在 Mac OS X 上,我错了。同样的原则也适用于 Mac OS X 应用程序。Cocoa 中的内存管理在 iPhone 和 Mac 上几乎相同。最大的不同是在 Mac 上可以进行垃圾收集。当然,在 Mac 上没有内存不足的警告,所以不要管它。

于 2011-02-20T22:18:51.147 回答
0

CustomTextField 中的 setStringValue: 有什么作用?我的猜测是您保留了传递的字符串,而没有在您的设置器中释放旧值。

于 2011-02-21T11:40:34.410 回答