代码之家  ›  专栏  ›  技术社区  ›  Mihai Damian

固有UIView泄漏

  •  2
  • Mihai Damian  · 技术社区  · 15 年前

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

    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已经提到了这个问题)。泄漏并不是在泄漏监视器中实际发现的—它们的存在只是通过不断增加的内存使用量来显示—这最终导致应用程序因内存耗尽而被操作系统终止。

    以前有人注意到吗?作为记录,代码是为OS3.0编译的。

    3 回复  |  直到 15 年前
        1
  •  1
  •   Glorfindel Doug L.    6 年前

    我想这是一个 仪表问题 . 与iPhoneOS3.0一起使用时,仪器无法正常工作,例如,您看不到堆栈跟踪。在模拟器中使用3.1时,此问题将消失(参见图片)。事实上这些并没有显示为仪器泄漏,这是我假设的原因。

    当然,这也可能是iPhone OS 3.0的一个问题,已经在iphoneos3.1中得到了修复。

    Instruments with OS 3.0
    (来源: hillrippers.ch )

    ^^仪器 操作系统3.0

    Instruments with OS 3.1
    (来源: hillrippers.ch )

    ^^仪器 操作系统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++;
    }
    
        2
  •  0
  •   Teemu Kurppa    15 年前

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

        3
  •  0
  •   Rob Napier    15 年前

    我同意这可能是iPhoneOS中的一个漏洞。看起来像是 CALayer 不会被释放。如果你强迫加莱尔释放( [test.layer release] ,这是一件疯狂的事情,但“有效”),您将显著减少内存使用,但您会发现QuartCore每次迭代至少泄漏16个字节,这在您的压力情况下累积得很快。我会打开雷达(bugreporter.apple.com)。