我有一个包含各种动画和图像的应用程序。该应用程序正常运行大约30分钟,但随后崩溃。我查看了这些工具,注意到每次标记堆时都会生成一大堆7kB的png_malloc
分配(每几分钟总计约300kB)。
我在我的泄漏中注意到,每次第一次使用动画或png
时,数据似乎都会"泄漏"(尽管我有点怀疑这是否是真正的泄漏)。
所有这些图像都已使用声明
frameName = [[NSString alloc] initWithFormat:@"image.png"];
UIImage * u = [UIImage cachelessImageNamed:frameName];
所以我认为缓存图像不应该有问题。
是否有其他人对此png_malloc
分配有同样的问题?
仪器屏幕截图
*注意:我使用的是arc,在deallocation函数中动画被设置为nil
;但是,在应用程序退出之前不会调用这些函数。如果动画只创建过一次,那么每次运行时都会产生问题吗?
编辑更多代码:
-(void) createSymbolAnimations
{
if (symbolAnimations == nil)
{
symbolAnimations = [[NSMutableArray alloc]init];
}
NSString * frameName;
if (thisAnimation == nil)
{
thisAnimation = [[NSMutableArray alloc] init];
}
for (int x= 0; x< 40; x++)
{
frameName = [[NSString alloc] initWithFormat:@"image%d%s",x,".png"];
UIImage * u = [UIImage cachelessImageNamed:frameName];
[thisAnimation addObject:u];
}
[symbolAnimations addObject:thisAnimation];
}
是动画的创作。想象一下,我有一些这样的,然后我改变动画集,开始用这个片段制作动画:
UIImageView * aView = [frameArray objectAtIndex:x];
aView.image = [[symbolAnimations objectAtIndex:x]objectAtIndex:0];
[aView startAnimating];
其中x
是我要设置动画的图像集,0
是动画的第一帧。
因此,图像被更改了好几次,我开始担心每次动画图像被更改时,RAM都不会被清除,而是被重写。
编辑图像采集器
+(UIImage *) cachelessImageNamed: (NSString *) name
{
return [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:name ofType:nil]];
}
为了防止以后有人偶然发现这个问题,我发现了问题。
该项目中用于动画的png是在Windows中创建的(不确定其相关性),文件格式似乎与XCode所期望的png略有不同。这将禁止释放任何png。如果您将格式转换为适用于Mac的png,它似乎可以正常工作。我是通过完成的
mogrify -type truecolormatte -format png *.png
在调整了我所有的图像后,泄漏大大减少了,一切似乎都很好。