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

问题描述:

我正在研究一个iPad应用程序,其中有一个表格视图。当用户在表格中选择一行时,我使用didSelectRowAtIndexPath来打开弹出窗口。当我尝试使用某个按钮时,收到一条错误消息,指出“发送到释放实例的消息”。我最初虽然错误被popover抛出(在viewDidLoad之类),所以我在代码中加入了一个断点。令我惊讶的是,我能够在我的表格视图中一步步完成popover和didSelectRowAtIndexPath的其他部分(实际上它只涉及到一些if块)。当我在自动生成的代码中出现一些未出现在我的任何类文件(看起来像0x0010d71d <+1164> mov 0x6...)的代码时,会出现此错误。是否有一个方法在didSelectRowAtIndexPath之后总是被调用?

所以,我的问题是,我怎么找到这个错误被抛出的地方?在didSelectRowAtIndexPath之后是否有另一种方法会自动运行,可能会在某处出现混乱?

+1

它告诉你哪个消息和实例属于哪个类? –

+1

当你分配popover时你使用'autorelease'吗? – jere

+0

@Phillip Mills:这是说 - [CFString发布]。我从来没有明确地使用CFString,所以它必须来自别的东西。也许我会谷歌它,看看我是否找到有用的东西。 – GeneralMike

好了,大家的反应使我找到malloc error -[CFString release],这帮助我找出我在我的酥料饼的一个字符串,我通过

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

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

要回答我发布的实际问题,我相信autorelease直到模拟器实际尝试显示弹出窗口(将在didSelectRowAtIndexPath之后运行)才会触发。因为这发生在我明确 viewWillAppear后,它试图autorelease东西不在那里。只是重申一下,正确的做法是让autorelease结束,而不是[myString release]我的代码中的任何地方。

有人可以验证这是正确的吗?正如我在我的评论中提到的,我对iOS开发还很陌生。在项目结束时我有一种感觉,我将能够回到我所做的第一件事,并根据最佳实践更有效地做更多的改进。

+1

是的,[myString发布]对于一个自动发布的对象来说是一个巨大的禁忌。升级到ARC,有一个关于ARC如何更新项目的WWDC 2011视频。 – CSmith

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

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

+0

我已经NSZombieEnabled不已,当我做了一个分析,我发现了唯一的东西是一帮在我酥料饼的细胞(这也是从一个UITableViewController建)“其在初始化过程中存储的值永远不会读”。我对这条消息并不熟悉,所以我现在正在查看它,看看这是否有帮助。 – GeneralMike

+0

编辑:它不在我弹出窗口中的单元格上,它位于原始视图的“cellForRowAtIndexPath”单元格中。 – GeneralMike

+0

所以现在在我的'cellForRowAtIndexPath'我有: '静态NSString * CellIdentifier = @“Cell”; MyCell * cell =(MyCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; cell = [[[MyCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; //加上一些关于从indexPath.row设置数组中的标签的东西' 从我收集的内容中,我为'cell'做了两次alloc。这部分我几乎是从教程中直接复制的,所以我不太确定它究竟做了什么,或者我需要删除哪一部分,或者如何解决它。 – GeneralMike