2010-08-10 69 views
0

我发布了另一个类似的问题。这是我的旧代码,因为有些ppl会说它会更好,但是我没有找到释放分配内存的解决方案。iphone UIImage数组内存泄漏(旧)

imageArray_danceright = [[NSArray alloc] initWithObjects: 
[UIImage imageNamed:@"FrankieDanceRetime_0001.jpg"], 
.. 40 images 
[UIImage imageNamed:@"FrankieDanceRetime_00040.jpg"],nil]; 


imageArray_danceleft = [[NSArray alloc] initWithObjects: 
[UIImage imageNamed:@"FrankieDanceRetime_0041.jpg"], 
.. 40 images 
[UIImage imageNamed:@"FrankieDanceRetime_00080.jpg"],nil]; 

imageArray_stand= [[NSArray alloc] initWithObjects: 
[UIImage imageNamed:@"FrankieSingtRetime_0001.jpg"], 
[UIImage imageNamed:@"FrankieSingtRetime_0002.jpg"], 
[UIImage imageNamed:@"FrankieSingtRetime_0003.jpg"],nil]; 

//start animation 
myimageview.animationImages = imageArray_stand; 
myimageview.animationDuration = 0.23; 
myimageview.contentMode = UIViewContentModeBottomLeft; 
myimageview.animationRepeatCount = 0.0; 
myimageview.image = [myimageview.animationImages objectAtIndex:1]; 
[myimageview startAnimating]; 


- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    touch = [[event allTouches] anyObject]; 
    if ([touch view] == overlay_fuesserechts) { 
    [myimageview setAnimationImages:imageArray_danceright]; 
     myimageview.animationDuration = 2.0; 
     myimageview.contentMode = UIViewContentModeBottomLeft; 
     myimageview.animationRepeatCount = 1; 
     [myimageview startAnimating]; 
    } 
    if ([touch view] == overlay_fuesselinks) { 
    [myimageview setAnimationImages:imageArray_danceleft]; 
     myimageview.animationDuration = 2.0; 
     myimageview.contentMode = UIViewContentModeBottomLeft; 
     myimageview.animationRepeatCount = 1; 
    [myimageview startAnimating]; 
    } 

它的工作正常..只是当我看着仪器/分配,它不释放内存。 它开始于8MB的'立场'动画,上升到32MB的fuesserechts,当我点击fuesselinks它上升到55MB(我有6更多的动画..所以更多,它只是崩溃) 当我确定[myimageview setAnimationImages:nil]; (在touchesBegan)每个setAnimationImages ...我仍然不释放内存。 Allocatoins总体字节数仍然增加。 当我设置[myimageview.animationImages发布];在(touchesbegan)每个setAnimationImages ...它甚至在几次触碰后崩溃。

感谢 克里斯

+0

没有代码在哪里释放你的3个数组。你只创建一次或多次? – Vladimir 2010-08-10 13:40:32

回答

1

好吧,现在我看到你的原始代码我想我看到了建议来自哪里。您可能需要使用imageWithContentsOfFile:(而不是您之前的问题),而不是imageNamed:。前者缓存其图像,而后者则不。虽然我不相信这是你的问题。

不太清楚的是此代码适合您的大型系统。我认为第一段代码(所有imageNamed:调用)都在init方法中?是这样吗?

//start animation部分真的是在相同的方法或其他地方。这是不明确的,因为您随后将您的touchesBegan:方法完整包含在内。

您也不会显示myimageview正在创建的位置 - 以及谁拥有它。如果你在同一个班级内创建它,那么你也应该在dealloc中发布它。谈到dealloc它似乎从这个版本中缺少 - 是只有在新版本?你需要它(更多)。

我知道很难明确地发布代码片段 - 但在这种情况下,我认为这些是需要澄清的事情。

如果您的设置代码(imageNamed:延伸段)每次都被调用,可能会很好地解释它 - 因为可能缺少释放myimageview

+0

谢谢我会考虑它:) – 2010-08-10 14:42:23

+0

我停止使用ImageAnimation ..我花了数小时,仍然没有成功。 现在我使用一个计时器,每个0.3秒呼叫一个循环,我只是分配和释放一个图像飞行..工作与流量和没有内存泄漏:) 只是想知道我使用那里 [myimageview.image release] ; myimageview.image = nil; \t \t \t myimageview.image = [UIImage imageNamed:[imageArray_spagat objectAtIndex:piccounter-1]]; 当我不设置myimageview.image =零;它也会在一段时间后崩溃..但为什么。无论如何,它将被分配一个命令? – 2010-08-10 15:08:10

1

在这段代码中,它看起来像你可能初始化三个数组每一次点击,但你永远不释放他们,所以数组只是内存堆叠起来。或者,你可能根本没有保留阵列。我不能说,因为代码提供的数组初始化没有上下文的类的其余部分。

您应该使图像数组保留类的属性,以便您只初始化它们一次。使用self.表示法正确访问它们,以保留它们。只在班级的释放方法中释放它们。

不要将发布发送到其他对象的属性。每个对象应专门管理自己的内存使用。在这种情况下,发送UIImageView的animationImages属性版本是一个很大的错误。它几乎总是会导致崩溃。

顺便说一句,用大量imageNamed调用来初始化阵列是很危险的。如果特定图像出现问题,您将很难跟踪错误。相反,使用可变数组并使用for循环构建数组。这样做会使代码更加紧凑并使错误变得明显。

+0

谢谢...我会看看..我也能dealloc ..但它的奇怪..在模拟器中它没有,但在设备上它dealloc。但是,当我释放每个动画时,所以它必须重新加载完成,它变慢了..现在寻找另一个解决方案,并将尽可能避免“setAnimation”为更大的一组图像。谢谢 – 2010-08-10 13:19:05