0

我正在开发一个 iPad 应用程序,其中有一个表格视图。当用户在表中选择一行时,我使用didSelectRowAtIndexPath打开一个弹出框。当我尝试使用某个按钮时,我收到一条错误消息,说“消息已发送到已释放的实例”。我最初虽然错误是由弹出框(在它viewDidLoad或其他东西中)抛出的,所以我在其中放置了一个断点并单步执行代码。令我惊讶的是,我能够一步一步地加载弹出框和didSelectRowAtIndexPath我的表格视图的其余部分(实际上只涉及退出一些 if 块)。当我在自动生成的代码中执行几个步骤时,该错误就会被抛出,该代码没有出现在我的任何类文件中(看起来像0x0010d71d <+1164> mov 0x6...)。

所以,我的问题是,我如何找到引发此错误的位置?是否有另一种自动运行的方法didSelectRowAtIndexPath可能会在某个地方搞砸?

4

2 回答 2

1

在您的 DEBUG 构建中启用 NSZombieEnabled(请参阅如何在 Xcode 4 中设置 NSZombieEnabled?)以定位您正在访问的已被释放/释放的对象的实例。

此外,考虑将您的项目升级到 ARC,这可能会解决此类内存管理问题。

于 2012-09-12T18:33:38.403 回答
0

好的,每个人的回答都让我找到了malloc 错误 -[CFString release],这帮助我弄清楚我的弹出框中有一个字符串,我viewDidLoad通过

myString = [NSMutableString stringWithString:[myGlobalFunctionClass getMyString]];

由于我以这种方式分配它,它被设置为自动释放。问题是我明确[myString release];myString = nil;viewWillAppear. 删除release=nil零件清除了我的错误。

为了回答我发布的实际问题,我相信autorelease直到模拟器实际尝试显示弹出框(将在 之后运行didSelectRowAtIndexPath)才触发。由于这发生在我明确地[myString release]in之后viewWillAppear,它试图做autorelease一些不再存在的东西。重申一下,正确的做法是让它autorelease在最后,而不是[myString release]在我的代码中的任何地方。

有人可以验证这是正确的吗?正如我在评论中提到的,我对 iOS 开发还是很陌生。在这个项目结束时,我有一种感觉,我将能够回到我在其中做的第一件事,并在做事更有效和更符合最佳实践方面做出数十项改进。

于 2012-09-12T20:51:26.820 回答