我有内存分配问题(无论如何都不会泄漏)。
我的程序有一个自定义Window
,其中自定义View
包含 a TextField
、 anImageView
和 a Shadow
。假设每 1 秒我以编程方式更新TextField
using的值[myTextField setStringValue:@"actual string"]
。
显然,每次更改 TextField 时,都会重绘视图。
如果我查看活动监视器,我会看到每次更新 TextField 时,都会重绘视图,分配的内存会增加。ImageView 不应该改变。
如果我用 注释该行(见更新 4。)setStringValue
,则程序运行时根本不会增加内存。
请注意,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];
}
哪里CustomTextField
有NSTextField
课。
我不知道我要添加的内容是否重要,无论如何自定义窗口、自定义视图和自定义文本字段是init
在代码中以编程方式定义和定义的,并且它们没有在界面生成器中实例化。
更新 2
我错了!即使我评论setStringValue
内存仍然增加......少了很多,但它仍然增加......奇怪的事实是,无论如何,仪器报告的“活体”大小保持不变并且没有报告泄漏。
怎么了?
更新 3
我刚刚使用了 Instruments 令人惊叹的 heapshots 功能,这就是结果。
我在活动监视器中看到的内存增加(几分钟后大约为数千字节)来自哪里?
更新 4
我想我已经找到了导致问题的原因,但我无法解决它。
View 有一个 TextField、一个 ImageView 和一个 Shadow。为了使它们在屏幕上正确显示而不会出现故障,我添加了[view setWantsLayer:YES]
. 如果我评论这一行,内存分配问题肯定解决了。
现在,只要我需要使用那个命令,我该怎么办?我应该发布与核心动画相关的东西吗?请注意,与 Core Animation 相关的唯一一个命令就是上述命令。