在黑暗中拍摄 - 应用程序错误

时间:2009-02-21 22:28:41

标签: iphone objective-c cocoa-touch memory-management

好的,所以如果没有你能看到我的申请,这将是一个黑暗的镜头!

我有一个错误。我有一个SwimmingPool课程,我的应用程序将池从tableview传递到详细视图,在那里你可以看到所有的swimPool类字段。然后,您可以单击各个详细信息,对其进行编辑,然后保存。复制“原始”池工具并将其传递给负责实际进行更改的视图控制器。如果用户按下保存,则会将字段从副本复制到“原始”

switch (self.sectionFromParentTable) {
    case KNameIndex:
        self.thePoolFacility.name = self.thePoolFacilityCopy.name;
        self.thePoolFacility.type = self.thePoolFacilityCopy.type;
        break;

    case KAddressIndex:
        self.thePoolFacility.address = self.thePoolFacilityCopy.address;
        break;

    case KPhoneNumberIndex:
        self.thePoolFacility.phoneNumber = self.thePoolFacilityCopy.phoneNumber;
        break;

    case KWebAddressIndex:
        self.thePoolFacility.webAddress = self.thePoolFacilityCopy.webAddress;          
        break;
    case KPricesIndex:
        self.thePoolFacility.prices = self.thePoolFacilityCopy.prices;
        break;
    case KPoolIndex:
        self.thePoolFacility.pools = self.thePoolFacilityCopy.pools;
    default:
        break;
}

[self.navigationController popViewControllerAnimated:YES];

我是否可以对执行以下操作的错误进行一些猜测:

  1. 该错误会导致更改完成 到一个班级'没有被保存的领域。特别是一个名为TimeEntry的类,在一个叫做“星期一”的可变数组中,在名为pool的类中称为TermTimes的Dictionary中,然后是一个名为Pools的可变数组。

  2. 它似乎是随机的。有时它     工作得很好。有时它     不!我无法重新创建错误,     只有我很幸运才能得到它     保存。我的预感是可能的     对时间敏感的。例如,如果我是     输入Pool的时间表     开放时间,如果我快速添加一个     几个条目,通常保存     工作良好。如果我填写一个整体     时间表然后它不止于此     不保存。

  3. 该应用不会崩溃。
  4. 它激怒了尝试并调试了一个似乎随机发生的错误。关于这样一个史诗般的虫子的任何暗示?

4 个答案:

答案 0 :(得分:2)

解决此类问题的最佳方法之一(似乎无法可靠地再现)是在您希望发生某些事情的各个领域插入日志记录代码。记录可能发生错误的位置,记录您期望的值以及您拥有的值等。接下来,尝试尝试,直到您可以重现该错误。

与以前不同,您现在有一个日志可以查看并查看出错的地方。如果在任何地方看起来仍然正确,请在其他位置插入更多日志代如果你看到出现问题但却不理解,那么在该区域放置更多的日志记录代码并继续缩小问题范围。

希望这会导致关于bug如何发生的新假设,并且您将能够可靠地在调试器下重现它并修复它!

正如duffymo所提到的,多线程可能是罪魁祸首,如果您故意使用多线程,那么首先进行调查是一个好地方。

答案 1 :(得分:0)

“随机”和“难以重现”让我觉得这是一个与多线程有关的问题。竞争条件非常难以重现和调试。您需要确保您拥有执行此操作所需资源的专有权。

答案 2 :(得分:0)

我的建议是寻找nils。对nil对象的任何方法调用都不会做任何事情并返回nil,所以每当你期望一个方法被调用而它不是,你应该寻找它。 (.foo =和setFoo:相同,所以nil.foo = 1;什么都不做。)

答案 3 :(得分:0)

感谢您的所有答案。它现在已经修好了。

对于那些感兴趣的人,我忘了在我的细胞亚类的XIB中添加一个cellidentifer。

因此,

cellForRow:方法每次都会创建一个新单元格。记忆很快就被填满了。然后,好像我的应用程序通过强制另一个tableView从编辑模式强制而不是正确管理我的实例来自动尝试削减脂肪。

这又是一个记忆问题。是不是总是这样!?!

线索是控制台中的一次性101错误,表明我的应用程序使用了太多内存。哦,还有一个慢滚动的表格。