0

嘿,我的应用程序有一些问题。这是我的第一个 IOS 大项目,到目前为止,我一直做得很好,有些部分在这里和那里遇到了麻烦。但是现在开发基本上结束了,我遇到了最大的问题,它一直困扰着我一段时间,我已经碰壁了。我还不确定该怎么做(我有一个想法,但不确定这是否可行)。在我的电脑上,它大部分时间都可以工作。有时它
崩溃,我得到一个错误(见下文)。当我收到错误时,我所做的通常是游戏正在运行,然后突然停止。实际上,我已经有一段时间没有收到该错误了,而且我大多是在开发时得到它。当应用程序在我老板的机器或实际设备上运行时(旁注,我们将应用程序从她的机器上传到设备而不是从我的机器上),它崩溃了。它总是在同一点崩溃。出现第一个视图,即标题屏幕。然后他们单击开始按钮并启动一个新视图。但是,他们单击开始按钮,应用程序最终崩溃。发生的情况是应用程序关闭并且调试器转到这部分代码。

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class]));
    }
}

此外,该应用程序是一个游戏。所有视图都使用 OpengelE。我在想正在发生的事情是使用了太多内存。游戏正在运行;系统需要更多内存,系统杀死进程释放内存;该过程是应用程序。这是基于我对 IOS 和应用程序生命周期的了解。我正在使用 ARC,但我已经使用他们的工具专门测试了游戏,我没有发现任何可能导致问题的内存泄漏或类似的事情。我认为该图像可能是明智的大文件大小。图像范围从 100kb 到 5 MB。我们正在缩小它们的尺寸,但我不确定这是否是问题所在。现在我唯一知道它为什么会崩溃的原因是它内存不足,而我发现的唯一原因是文件大小。我不是 100% 确定这是原因,因为它没有解释为什么它在我的机器上没有崩溃(至少最近没有),但它在她身上发生了(它解释了为什么它对她的机器和设备如此,它解释了为什么它有时会发生在我的身上,而不是它们发生在不同的条件下)。此外,我一直听说在这种情况下应该会出现某种类型的低内存警告。有人可以确认否认吗(我对此进行了研究,但没有发现很多

所以我要问的是,是否有人可能对这个问题的原因有更多建议,或者至少引导我进入我应该更多研究的主题。你认为降低图像的文件大小会起作用吗?往往有 1 个大约 1-3 的背景,然后是 8 到 40 个 100kb 的图像。

编辑 我使用了配置文件模式仪器。该应用程序开始使用 100mb,然后在播放时增加到 500mb(这是在真实内存中)。我注意到只有当我切换到新级别时它才会增加内存。我想这是因为每个级别都有更多的图像显示,但后来我做了一个测试。在测试中,当一个级别完成时,而不是进入下一个级别,再次播放级别一个。每个级别都是 Class Level 的一个对象。我的 ViewControler(它是 GLKViewController 的子类)有一个名为 currentLevel 的属性。游戏使用以下代码切换到下一个级别:

-(void) nextLevel: (Level) newLevel
{
    //play sound
    MyAppDelage *del=[[UIApplication sharedApplication] delegate];
    UIWindow *main=[delegate window];
    MyViewControler *view=(MyViewControler*) main.rootViewController;
    view.currentLevel=newLevel;
 }

所以我认为正在发生的是旧关卡由于某种原因永远不会被垃圾收集;如果这有什么不同,currentLevel 就很强大。我也有@synthesize currentLevel =_currentLevel; 这是我第一次学习Objective C时编写的非常古老的代码。当时我只是在学习示例。可能更改强类型或删除 @synthesize 部分会帮助解决这个问题吗?我习惯了更多的 C++/C#/Java 语法,所以我真的不习惯一些客观的 C 风格。

4

1 回答 1

6

在没有看到您的任何代码的情况下,我建议检查以下内容:

  1. 检查您使用的图像是否具有小像素尺寸,因为 Apple 建议宽度/高度大于 1024 像素的图像应该更好地分割成图块。以 Apple 的 PhotoScroller.app 代码为例。请注意,虽然图像可能很小(例如 100 kb),但为了显示它,iOS 需要使用每个像素 4 个字节对其进行解码!因此,3000x3000 像素的图像使用 3000x3000*4=36,000,000 字节,相当于大约 34 MB 内存。
  2. 尽管您使用的是 ARC,但请查看代码中可能处理图像的 for/while 循环,并使用 @autoreleasepool { .. } 围绕(如果适用)图像处理代码。例如:

    for (NSString *imageName in imageNames) {
        @autoreleasepool {
            //... code here to get your images for display ...
        }
    }
    
  3. 仔细研究如何处理检索大量图像,即 iOS 缓存使用 'imageNamed' 与 'imageWithContentsOfFile' 获取的图像。这种技术特别适用于使用 CATiledLayers 处理大图像。以下代码片段显示了获取图像的两种方式:

    // The fetched image is cached by iOS when using:
    UIImage *image1 = [UIImage imageNamed:@"myimagename.png"];
    // You can control memory usage and freeing of the image when using:
    UIImage *image2 = [UIImage imageWithContentsOfFile:@"myPath/myimagename.png
    
  4. 您还可以查看 Apple 的 LargeImageDownsizing 示例中使用的代码,但请注意,在处理 PNG 文件时,这对我不起作用。我向 Apple 提交了一份错误报告(去年 11 月),但还没有听到任何消息。

  5. 最后,在真实设备上进行测试时不要等待太久,因为您的开发 Mac 至少比目标 iDevice 快 10 倍,并且在您开始注意到与内存相关的问题之前还有更多的可用内存。顺便说一句,使用 Instruments.app 分析您的应用程序始终是一个好习惯。

希望以上建议对您有所帮助!只是我的 2(欧元)美分,它的价值是多少。

于 2013-03-27T22:53:14.157 回答