我正在开发一款iPad应用程序,我可以在其中查看表格。当用户在表格中选择一行时,我使用didSelectRowAtIndexPath
打开一个弹出窗口。当我尝试使用某个按钮时,我收到一条错误消息“消息发送到解除分配的实例”。我最初虽然错误被popover抛出(在它的viewDidLoad
或其他东西),所以我放入一个断点并逐步完成代码。令我惊讶的是,我能够在我的表视图中加载弹出窗口和didSelectRowAtIndexPath
的其余部分(实际上只涉及走出一些if块)。当我在自动生成的代码中执行一些没有出现在我的任何类文件(看起来像0x0010d71d <+1164> mov 0x6...
)中的步骤时,会抛出错误。
所以,我的问题是,如何找到抛出此错误的位置?是否有另一种方法在didSelectRowAtIndexPath
之后自动运行,可能会在某处搞乱?
答案 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开发还是一个新手。我对这个项目的结尾有一种感觉,我将能够回到我在其中所做的第一件事,并根据最佳实践在更有效率和更多事情方面做出了数十项改进。