【问题标题】:iPhone Dev: big png sequences cause crash?iPhone Dev:大 png 序列导致崩溃?
【发布时间】:2010-11-02 06:55:41
【问题描述】:

我正在构建一个应用程序,其中包含许多图像序列(5 个序列,每个序列大约 80 个图像)。它在 iPhone 模拟器中运行良好,但在我测试它时会导致我的 iPhone 重新启动。顺便说一句,每个 png 图像的大小约为 8k。 有没有人成功构建过类似的应用程序? 我是否使用了太多资源让 iPhone 无法处理? 有人吗?

更新:
感谢大家的回答!我修改了我的代码以使用 [UIImage imageWithContentsOfFile:] 而不是 [UIImage imageNamed:] 但是我仍然无法阻止该应用程序使我的 iPhone 崩溃。 (请注意,我的 png 没有那么大,大约 400x400px / 8k)

有人有什么建议吗?

这是我的代码:

    // code snippet:
    myFrames = [[NSMutableArray alloc] initWithCapacity:maxFrames];
            NSMutableString *curFrame;
            num = 0;
    // loop (maxframes = 80)
            for(int f = 1; f < maxFrames+1; f++)
            {
                curFrame = [NSMutableString stringWithString:tName];

                if(f < 10) [curFrame appendString:[NSString stringWithFormat:@"00%i",f]]; 
                else if(f>9 && f<100) [curFrame appendString:[NSString stringWithFormat:@"0%i",f]]; 
                else [curFrame appendString:[NSString stringWithFormat:@"%i",f]]; 

                UIImage *img = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:curFrame ofType:@"png"]];

                if(img) [myFrames addObject:img];
                [img release];
            }
// animate the images!
            self.animationImages = myFrames;
            self.animationDuration = (maxFrames * .05); // Seconds
            [self startAnimating];

【问题讨论】:

    标签: iphone objective-c cocoa-touch


    【解决方案1】:

    找出答案的最佳方法是使用 Leaks 或 Object Alloc 在 Instruments 下运行应用程序。如果您看到持续上升的上升趋势,则可能存在泄漏。

    如果您使用的是 [UIImage imageNamed:],您应该知道它预先缓存了一个优化版本,与 [UIImage imageWithContentsOfFile:] 相比,它会占用更多内存。此外,在 iPhone 3.0 之前,由 [UIImage imageNamed:] 创建的缓存在出现内存警告时不会被释放。

    当前一代 iPhone 只有 128MB 的内存,其中一些是由操作系统本身使用的。使用 Alpha 通道完全未压缩的 320x480 图像可能需要 614k。如果您有 400 张全屏的独特图像,那么内存就远远超过 128MB,假设它已加载并缓存未压缩。

    【讨论】:

      【解决方案2】:

      应用不会在模拟器上而是在手机上崩溃的第一大原因是内存

      在 iphone 模拟器 AFAIK 上,内存不限于 128Mb,而在 iphone 上,一旦达到 128Mb,它就会重新启动。因此,请检查您在模拟器上的内存使用情况。您必须更改加载图像和/或检查泄漏的方式。还可以通过实现这些方法来检查您是否收到内存不足警告(我忘了它们叫什么:()

      【讨论】:

        【解决方案3】:

        我看到应用程序在模拟器中运行,而不是在手机上运行,​​因为 PNG 格式不正确(即使是单个格式不正确的图像也可能导致此崩溃)。检查以确保您的图像格式与苹果在其示例应用中提供的 PNG 文件格式相匹配。

        话虽如此,400 张全屏图像很容易导致内存不足,因为它们占用的内存远远超过 8kb。不确定这些图像有多大,但如果它们都在内存中,它们在 iPhone 上将需要非常非常小。

        【讨论】:

          【解决方案4】:

          您的问题的第一个答案表明,虽然您的 PNG 可能仅占用 8K 磁盘空间,但这是压缩的磁盘形式。当它被加载到内存中时,它被解压缩并且比8K大得多。在每像素 32 位时,400x400 图像将为 640K。

          即使没有 Alpha 通道,您看到的也是 480K。 480K x 80 帧,即 38.4MB,这肯定会逐渐占用比 iphone 可以同时提供给您的应用程序更多的内存。 Here 是一篇关于从 iPhone OS 获取大量内存时遇到的一些问题的文章。

          【讨论】:

            猜你喜欢
            • 2013-05-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-09-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-05
            相关资源
            最近更新 更多