当我触摸UIImageView时,为什么会出现这种奇怪的内存泄漏?

时间:2009-06-03 09:32:33

标签: iphone memory-management instruments memory-leaks

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

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

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

更新:我稍微考虑一下,并且发现,当用5个手指快速敲击时,屏幕上的任何位置都会发生内存泄漏。我从Instruments.app得到的一切都是关于一些运行和事件循环。似乎设备无法足够快地处理触摸,然后在释放分配的对象时卡在某个点上。如果你能看到同样的问题,请试试并报告。

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

1 个答案:

答案 0 :(得分:2)

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

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

解决方案:关闭加速度计(委托设置为零),减少应用中的观看量。我不知道他们是否在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