1

我在我的 Iphone 应用程序上进行了一些压力测试。结果如下。我想知道我是否应该担心,如果是的话,我会怎么做。

我设置了一个计时器,每秒触发一次。每当计时器触发时,应用程序都会从​​服务器请求一些 XML 数据。当数据到达时,应用程序会解析数据并重新显示受影响的表格视图。在几次试验中,应用程序在崩溃之前平均循环大约 500 次。

然后我从上述循环中删除了解析和重新显示步骤。现在它可以运行大约 800 次。

我设置了一个循环来重复重新显示表格视图,而不下载任何东西。一次重新展示完成后,下一次就开始了。2601 次循环后,应用程序崩溃。

以上所有数字都大于用户可能会做的事情。

此外,当我尝试在仪器下的设备上运行它时,我的应用程序根本不会持续很长时间。所以我无法以这种方式获得有用的数据。(但如果没有仪器,它会持续很长时间,如上所述。)

4

1 回答 1

2

我会说你需要非常担心。编程的第一条规则是用户永远不会做你期望的事情。

需要考虑的事项:

  • 访问器方法。使用它们。为所有属性设置属性并始终使用适当的 getter/setter 方法访问它们:

.

object.property = some_other_object;      -OR-
[object setProperty:some_other_object];

object = some_other_object.some_property;
object = [some_other_object some_property];

抵制做以下事情的诱惑:

property = some_other_object;
[property retain];
  • 您是否从 ObjectAlloc 获得输出?内存泄漏、性能和对象分配有 4 个工具。他们都没有加载吗?
  • 当应用程序崩溃时你会得到什么?EXEC_BAD_ACCESS 或其他一些错误?
  • 平衡的保留(分配或复制)和释放。以相同的方法使每个分配/复制与释放/自动释放保持平衡是一个好主意。如果您一直使用访问器,则很少需要手动发布。
  • 自动释放通常会隐藏一个真正的问题。Autorelease 可能会掩盖一些棘手的分配问题。仔细检查您对自动释放的使用。

已编辑(根据您的故障代码添加)基于您对“程序接收信号:0”的上述回答。这表明您的内存已用完。我将首先查找您的代码执行以下操作的实例:

myObject = [[MyClass alloc] init];
[someMutableArray addObject:myObject];

当您将新对象放入数组时,您没有“释放”。如果这个数组随后被释放,对象 myObject 将成为孤儿,但无论如何都会在内存中徘徊。执行此操作的简单方法是使用 grep 查找所有“alloc”/“copy”消息。除非在极其罕见的情况下,在同一个函数中应该有成对的“release”“/autorelease”。通常情况下,以上内容应该是:

myObject = [[[MyClass alloc] init] autorelease];
[someMutableArray addObject:myObject];
于 2010-02-26T05:49:04.223 回答