0

在我的一个中UIViewControllers,我有一个UITableView,它只有两行,并且都始终在屏幕上可见。这是历史上的表格视图(另一位开发人员这样做了 - 我没有坚持下去)。因为表格的两行总是可见的,所以当cellForRowAtIndexPath调用 my 时,我从 XIB 创建一个单元格并存储对其中一个子视图 ( UITextView) 的引用。当我需要从中获取文本时UITextView,我只需使用本地参考。这很好用 - 大多数时候。

在一个特定情况下,我从这个导航到另一个UIViewController(使用pushViewController:animated)。那个新的视图控制器使用了相当多的内存,所以在内部 iOS 会从第一个视图控制器中取消分配表行(它不再可见,因为另一个视图控制器处于活动状态) - 当我返回到第一个视图控制器时,它只是调用cellForRowAtIndexPath再次。当该行被释放时,我在内部存储的引用自然不再有效 - 如果我尝试使用它,应用程序崩溃(“选择器发送到释放的实例”)。

我的问题是:当 iOS 内部释放表格单元格时,我如何才能捕捉到,以便我可以将我的引用设置nil为稍后重新分配?

4

3 回答 3

0

在 iOS 5.0+ 中,最简单的解决方案是使用__weak对文本字段的引用。nil当对象被释放时,它会自动设置。

在早期的 iO​​S 版本中,没有简单的解决方案。您可以继承UITextFieldor UITableViewCell,覆盖子类中的releaseordealloc方法,然后从那里发送通知,告诉您的视图控制器有关该事件的信息。但这对我来说听起来像是一个非常晦涩的黑客攻击。更好地确保您的参考始终有效 - 通过将其设置为nilinviewDidUnload并在以后需要时重新创建它。

于 2012-06-14T09:44:37.707 回答
0

在 iOS MVC 世界中,无论如何,您通常不应该依赖从 UITextView 检索数据来实现相关视图之外的目的。当您转到其他视图时,您永远不知道操作系统会对视图执行什么操作。您可能希望将 UITextView 中的字符串存储在某个对象中,该对象要么传递给那些视图控制器,可供其他视图控制器访问(例如,单例或应用程序委托的属性),要么存储在某个持久存储中。

顺便说一句,即使由于内存不足而释放视图,或者由于您在其他表格视图中使用相同的单元格标识符而导致单元格出列,它的视图控制器仍然存在,因此您不必担心关于丢失您在那里设置的任何属性,除非您在 didReceiveMemoryWarning 中明确执行某些操作来释放它。

于 2012-06-17T18:36:22.080 回答
0

显然,我发现处理这个问题的唯一方法是包括

- (void)didReceiveMemoryWarning;

回调并将引用设置到nil那里。不确定这是否是处理这种情况的最佳方法,但它确实有效。

于 2012-06-28T15:58:58.100 回答