1

这真的很奇怪。我有一个空白的 UIImageView 子类,它实现了 -touchesEnded:、-touchesMoved 和 -touchesBegan: 方法。这些方法的实现是空的。他们只是什么都不做。但是,当我使用“Leaks”运行 Instruments 时,我触摸 UIImageView 并将手指移到 UIImageView 之外,同时仍然触摸屏幕,我收到 Instruments 的 Memory Leak 警告。

在我的演示应用程序中,这样做时不会发生对象分配。方法是空的。我在 Instruments 中阅读的所有内容都与 Foundation 和 Run Loop 相关。我已经检查了我的班级两次并删除了任何对象分配。它只是一个只显示图像的骨架,但是当触摸它或在屏幕上移动手指时,该图像不会改变。这是没有意义的。

有没有其他人遇到过这样的问题?

更新:我测试了一下,发现当用 5 个手指快速敲击时,屏幕上的任何位置都会发生内存泄漏。我从 Instruments.app 得到的一切都与一些运行和事件循环有关。似乎设备无法足够快地处理触摸,然后在释放分配的对象时卡住了。如果您发现相同的问题,请尝试并在此处报告。

更新:我现在也测试了一些 Apple 示例应用程序。当我像普通用户一样用 3 到 5 根手指在屏幕上进行黑客攻击时(是的,他们会这样做!),然后 Instrument 会显示有关事件和运行循环的内存泄漏。在框架或工具中肯定有一个大的。使用 iPhone OS 2.2.1 测试。

4

1 回答 1

2

正如在苹果论坛上阅读的那样,这是 SDK 中未解决的问题。当加速度计委托不为零时会发生这种情况。触摸事件对象被分配但从未被释放。调用加速计委托的速度越快,分配失败发生的速度就越快。许多苹果示例代码都显示了同样的问题。我打开了加速度计。

但我也遇到过,当触摸从一个视图跟踪到另一个视图时,就会发生这种泄漏。如果我一直触摸同一个视图并在该视图上移动手指而不离开它,我就不会遇到这个问题。

解决方案:关闭加速计(delegate 设置为 nil),减少应用中的视图数量。我不知道他们是否在 iPhone OS 3.0 中解决了这个问题。

不幸的是,这无济于事:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [[UIAccelerometer sharedAccelerometer] setDelegate:nil]; // because of framework bug
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [[UIAccelerometer sharedAccelerometer] setDelegate:self]; // because of framework bug
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    [[UIAccelerometer sharedAccelerometer] setDelegate:self]; // because of framework bug
}

更多信息请访问:http ://discussions.apple.com/thread.jspa?messageID=9396584t

于 2009-06-03T10:48:36.777 回答