0

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

我已经设置了这个基本测试,试图找出我的内存没有被释放的原因:

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

现在我将把它放在触摸开始并通过在第一次触摸后开始使用仪器(通常为 11.5 - 12mb)监控内存使用情况进行测试,没有对象存在纹理被创建并且内存跳转到 13.5 - 14

但是,在第二次触摸后,内存确实会减少,但只会下降到 12.5 - 13 左右。

仍有一块明显的内存被占用。

我在更大的范围内对此进行了测试,一次加载 10 个这样的大纹理。内存跃升至 30 mb 以上并保持在那里,但在释放纹理后的第二次触摸时,它仅下降到 22mb 左右。

我再次尝试使用 [uiimage imagenamed:] 加载图像进行测试,但由于缓存,此方法执行它仅意味着完整的 30mb 保留在内存中。

4

2 回答 2

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);
}

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

作为最后的手段,对于真正棘手的分配/释放跟踪问题,我重写了保留、释放、释放方法,以验证它们是否在我期望的时候被调用。在这一点上这可能有点矫枉过正,但方法如下:我添加了一个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];
}
于 2010-05-04T03:32:49.433 回答
0

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

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

于 2010-05-04T23:22:06.787 回答