是否有一个方法总是在didSelectRowAtIndexPath之后立即被调用?

时间:2012-09-12 18:29:55

标签: ios uitableview uipopover

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

所以,我的问题是,如何找到抛出此错误的位置?是否有另一种方法在didSelectRowAtIndexPath之后自动运行,可能会在某处搞乱?

2 个答案:

答案 0 :(得分:1)

在您的DEBUG构建中启用NSZombieEnabled(请参阅How do I set up NSZombieEnabled in Xcode 4?)以查找您正在访问的已被解除分配/释放的对象的实例。

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

答案 1 :(得分:0)

好的,每个人的回复都会让我找到malloc error -[CFString release],这有助于我弄清楚我的弹出窗口中有一个字符串,我在viewDidLoad中分配了

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

因为我以这种方式分配它,所以它被设置为autorelease。问题是我在[myString release];中明确myString = nil;viewWillAppear。删除release=nil部分会清除我的错误。

要回答我发布的实际问题,我相信autorelease在模拟器实际尝试显示弹出窗口(将在didSelectRowAtIndexPath之后运行)之后才会触发。由于这是在我[myString release]中明确viewWillAppear后发生的,所以它试图autorelease不再存在的东西。重申一下,正确的方法是让它autorelease放在最后,而不是[myString release]我的代码中的任何位置。

有人可以验证这是否正确?正如我在评论中提到的,我对iOS开发还是一个新手。我对这个项目的结尾有一种感觉,我将能够回到我在其中所做的第一件事,并根据最佳实践在更有效率和更多事情方面做出了数十项改进。