Im Stumped,为什么UIImage \ Texture2d内存没有被释放

时间:2010-05-04 02:10:26

标签: iphone uiimage memory-management texture2d

我一直在寻找解决这个问题的方法。似乎没有任何帮助。

我已经设置了这个基本测试,试图找出为什么我的记忆没有被释放的原因:

if (texture != nil)
{
[texture release];
texture = nil;
}
else
{
UIImage* ui = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"image" ofType:@"png"]];
texture = [[Texture2D alloc] initWithImage:ui];
}

现在我将其置于接触开始并通过使用intstruments在开始时监视内存使用情况进行测试(通常为11.5 - 12mb) 在第一次触摸后,没有对象存在,纹理被创​​建,内存跳转到13.5 - 14

然而,在第二次触摸后,内存确实减少了,但只有12.5到13左右。

有一大堆内存仍然被占用。

我在更大规模上测试了它,一次加载10个这样的大纹理 内存跳到超过30 mb并保持在那里,但是在释放纹理后的第二次触摸它只会下降到22mb左右。

我再次尝试使用[uiimage imagenamed:]加载图像,但由于缓存此方法执行它只意味着整个30mb仍然在内存中。

2 个答案:

答案 0 :(得分:0)

您的代码中只有一个地方(我们可以看到),其中纹理可以解除分配,并且位于[texture release];语句。

您需要执行该语句(或其他地方的语句)。您是否验证了所分配的每个纹理,您还可以释放它吗?您可以添加NSLog语句来提供帮助,如下所示:

if (texture != nil) {
    NSLog("releasing texture instance: %08x", texture);
    [texture release];
    texture = nil;
} else {
    ...
    texture = [[Texture2D alloc] initWithImage:ui];
    NSLog("allocated texture instance: %08x", texture);
}

也许纹理被保留在其他地方?例如,您是将它添加到子视图还是数组或字典?那些保留其内容。

作为最后的手段,对于非常严格的分配/释放跟踪问题,我已经覆盖了retain,release,dealloc方法,以验证它们是否在我预期时被调用。这可能有点矫枉过正,但问题如下:我添加了一个int myRetainCount; ivar来帮助我跟踪:

-(void)release {
    NSLog(@"release %08x %2d -> %2d (%u)", 
          self, myRetainCount, myRetainCount-1, self.retainCount);
    myRetainCount--;
    [super release];
}

-(id)retain {
    NSLog(@"retain  %08x %2d -> %2d (%u)", 
          self, myRetainCount, myRetainCount+1, self.retainCount);
    myRetainCount++;
    return [super retain];
}

- (void)dealloc {
    NSLog(@"dealloc %08x %2d       (%u)", self, myRetainCount, self.retainCount);

    // deallocate self's ivars here...

    [super dealloc];
}

答案 1 :(得分:0)

我似乎发现了这个问题。我不太清楚它为什么会发生,但是当我运行仪器监视内存使用情况时,如果我同时监视I / O活动(这是最初加载的默认仪器),显示的内存使用量大很多(超过3倍)并且即使在对象被释放后仍保留在内存中。我认为这是因为监视I / O活动的开销。

无论如何,当我关闭它时,内存使用情况最初报告为3.16mb(好多了),并在加载10个巨大纹理时跳转到10mb,然后在卸载纹理后再回到3.16。一个辉煌的结果。