代码之家  ›  专栏  ›  技术社区  ›  Anonymouslemming

第二次选择同一行时应用程序崩溃

  •  0
  • Anonymouslemming  · 技术社区  · 15 年前

    我正在开发的iPhone核心数据应用程序遇到了问题。我有一个列出对象的表。如果我选择这些对象中的一个,我将转到一个显示对象细节的新的视图控制器。

    在细节视图中,我有一个后退按钮,它将我带回到主列表视图。

    我可以选择任意数量的行,它将显示每个行的详细视图。但是,如果我试图选择一个已经选择的行,它将崩溃

    程序接收信号: _156;exc_bad_access__

    我添加了一些断点并试图跟踪它,在我的TableView CellForRowatindexPath方法中找到了以下内容…

    当我对每个对象执行 myEntity*thingamy=[获取结果控制器对象索引路径:索引路径] ThingGamy有效,并设置为有效的ThingGamy。在gdb中,我可以在这一点设置一个断点并执行

    波辛格 我得到了预期的输出。

    但是,第二次选择特定行(例如,选择行0、返回、再次选择行0)时,thingamy设置不正确。

    我可以查看任何数量的其他行,但一旦我尝试选择一行,我就已经查看了此操作的详细信息。

    如果我已经设置了断点,并且在设置了断点后尝试执行po thingamy,那么我将得到以下信息:

    程序接收到信号exc_bad_access,无法访问内存。 原因:kern_protection_失败,地址:0x00000020 objc_msgsend()中的0x92CA3ED7

    知道为什么FetchedResultsController在第一次调用时返回有效对象,而不是第二次调用时返回有效对象吗?

    更新

    几天后,我敢肯定,回迁结果控制器没有问题。我启用了nszombieEnabled模式,但没有任何问题。

    另外,我可以从FetchedResultsController获取其他对象,只是我已经访问过的对象没有。

    例如,我可以 [FetchedResultsController对象索引路径:[nsIndexXPath indexPathForRow:0杀虫:0]并在我的下一个视图中显示。

    当我回击并返回到父视图时,我可以在indexPathForRow:0中获取对象,并显示该对象。

    再次回到开头,我尝试获取indexPathForRow:0杀虫:0,但它与exc_bad_访问崩溃。

    在一个有100行的表中,我可以得到每一行一次,但是任何试图得到同一行两次的尝试都会崩溃,即使这些尝试是一个接一个的。

    4 回复  |  直到 15 年前
        1
  •  1
  •   Matt Long    15 年前

    我和一个未保存的结果控制者有这个确切的问题。我解决了它 turning on NSZombieEnabled in Xcode . 在我的情况下,结果是我过度释放了未保存的结果控制器。

    我第一次加载数据时,它就工作了,但后来我在释放它时没有意识到它。下一次,我发布了我已经发布的同一个实例,它将崩溃。

    如果仍然有问题,请发布nsfetchedresultsController初始化代码。

        2
  •  0
  •   ChrisLively    15 年前

    听起来,当您返回时,列表实际上已经被销毁,指针不再引用有效的内存地址。你有什么东西可以把清单处理掉吗?

        3
  •  0
  •   shawnwall    15 年前

    是否实现了以下方法?

    - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
        // In the simplest, most efficient, case, reload the table view.
        //[self.tableView reloadData];
    }
    

    也许在那里抛出一个断点,看看内容是否在改变?考虑到控制论者的讨论结果,我认为你可能正处于这样一种情况下,这可能会有所帮助。

        4
  •  0
  •   Anonymouslemming    15 年前

    我终于找到了答案!

    在我的dealloc部分中,我取消分配了许多变量,而不是释放它们。现在我已经将这些更改为发布,一切都按预期工作。