- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了内存分配问题(无论如何都没有泄漏)。
我的程序有一个自定义Window
,其中包含一个View
,其中包含一个TextField
、一个ImageView
和一个阴影
。假设我每 1 秒使用 [myTextField setStringValue:@"actual string"]
以编程方式更新 TextField
的值。
显然,每次 TextField 发生更改时, View 都会重新绘制。
如果我查看事件监视器,我会发现每次更新 TextField 并因此重新绘制 View 时,分配的内存都会增加。 ImageView 不应该改变。
如果我用
(请参阅更新 4。)setStringValue
注释该行,则程序运行时根本不会增加内存。
请注意,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/
我是一名优秀的程序员,十分优秀!