【问题标题】:Apparent leaks: png_malloc明显泄漏:png_malloc
【发布时间】:2012-11-16 18:13:16
【问题描述】:

我有一个包含各种动画和图像的应用程序。该应用程序可以正常运行大约 30 分钟,但随后崩溃。我查看了这些工具,发现每次标记堆时都会构建一大堆 7kB png_malloc 分配(每几分钟大约 300kB)。

我在泄漏中注意到,每次第一次使用动画或png 时,似乎都会出现数据“泄漏”(尽管我有点怀疑这是否是真正的泄漏)。

所有这些图像都已使用

声明
frameName = [[NSString alloc] initWithFormat:@"image.png"];
UIImage * u = [UIImage cachelessImageNamed:frameName];

所以我认为缓存图像应该没有问题。

还有其他人对此png_malloc 分配有同样的问题吗?

The instruments screenshot

*注意:我正在使用 arc 并且动画在释放函数中设置为 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];
}

是动画的创作。想象一下,我有其中一些,然后我更改了动画集并开始使用这个 sn-p 进行触摸动画:

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

【问题讨论】:

  • 你能发布更多代码吗?不确定 frameName 的使用方式。
  • cachelessImageNamed的实现从何而来?
  • 糟糕,我忘了我为此写了一个函数。以上编辑。
  • 什么时候清空数组 thisAnimation 和 symbolAnimations?目前,您只是向它们添加对象。我猜您希望 thisAnimation 成为您每次调用 createSymbolAnimations 时分配的局部变量
  • createSymbolAnimations 仅在加载应用程序时调用,然后在退出应用程序时清空数组。所以理想情况下,我不应该在每次制作动画时都使用更多内存,但这似乎是出于某种原因。

标签: ios memory-leaks png malloc


【解决方案1】:

以防万一以后有人偶然发现这个问题,我发现了问题。

此项目中用于动画的 png 是在 Windows 中创建的(不确定这是否相关),并且文件格式似乎与 XCode 所期望的 png 略有不同。这不允许任何 png 被释放。如果您将格式转换为 Mac 的 png,它似乎可以正常工作。我这样做是通过

 mogrify -type truecolormatte -format png *.png

在调整了我的所有图像后,泄漏大大减少了,一切似乎都运行良好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多