在活动监视器中运行时,运行以下代码的程序的实际内存使用量将无穷无尽地增加:
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编译的。
答案 0 :(得分:1)
我猜这是的问题。使用iPhone OS 3.0时,仪器无法正常工作,例如你看不到堆栈的痕迹。在模拟器中使用3.1时,此问题消失(请参阅图像)。这些没有出现在仪器泄漏的事实有助于我的假设。
当然也可能是这确实是iPhone OS 3.0的问题,并已在iPhone OS 3.1中修复。
(来源:hillrippers.ch)
^^具有 OS 3.0的仪器
(来源: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)。