固有的UIView泄漏

时间:2009-09-04 09:36:59

标签: iphone cocoa-touch memory-leaks uiview

在活动监视器中运行时,运行以下代码的程序的实际内存使用量将无穷无尽地增加:

CGRect frame = CGRectMake(0,0,0,0);
while(true)
{
    NSAutoreleasePool *pool = [NSAutoreleasePool new];
    UIView *test = [[UIView alloc] initWithFrame:frame];
    [test release];
    [pool release];
}

从UIView派生的所有对象都会泄漏。有些会比其他人泄漏更多(特别是UITextView已经引起了对这个问题的关注)。在泄漏监视器中不会发现泄漏 - 它们的存在仅通过内存使用量的不断增加而显示 - 这最终导致应用程序因内存耗尽而被操作系统终止。

有没有人注意过这个?为了记录,代码是为OS 3.0编译的。

3 个答案:

答案 0 :(得分:1)

我猜这是问题。使用iPhone OS 3.0时,仪器无法正常工作,例如你看不到堆栈的痕迹。在模拟器中使用3.1时,此问题消失(请参阅图像)。这些没有出现在仪器泄漏的事实有助于我的假设。

当然也可能是这确实是iPhone OS 3.0的问题,并已在iPhone OS 3.1中修复。

Instruments with OS 3.0
(来源:hillrippers.ch

^^具有 OS 3.0的仪器

Instruments with OS 3.1
(来源:hillrippers.ch

^^具有 OS 3.1

的仪器

这是使用的代码(在applicationDidFinishLaunching:

NSUInteger i = 0;
CGRect frame = CGRectMake(0.f, 0.f, 100.f, 50.f);
while (i < 100000) {
    UIView *test = [[UIView alloc] initWithFrame:frame];
    [test release];
    i++;
}

答案 1 :(得分:0)

可能是UIKit在构造UIView时使用共享单例对象,并且这些单例分配的东西不一定由NSAutoreleasePool清理,而是在标准事件循环执行期间通过其他方式清除。

答案 2 :(得分:0)

我同意这可能是iPhoneOS中的一个错误。看起来CALayer似乎没有被释放。如果强制额外发布CALayer([test.layer release],这是一件疯狂的事情,但“有效”),你将大大减少内存使用量,但你会发现QuartCore仍然至少泄漏每次迭代16个字节,在压力情况下快速增加。我打开雷达(bugreporter.apple.com)。