从UITableCell子视图中取消分配引用

时间:2012-06-14 09:33:14

标签: ios

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

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

我的问题是:当iOS内部发布表格单元格时,我怎样才能捕获,以便我可以将我的引用设置为nil以便稍后重新分配?

3 个答案:

答案 0 :(得分:0)

在iOS 5.0+中,最简单的解决方案是对文本字段使用__weak引用。在取消分配对象时,它将自动设置为nil

在早期的iOS版本中,没有简单的解决方案。您可以继承UITextFieldUITableViewCell,覆盖子类中的releasedealloc方法,然后从那里发送一个通知,告诉您的视图控制器有关该事件的信息。但这听起来像是一个非常模糊的黑客。最好确保您的参考始终有效 - 将其设置为nil中的viewDidUnload并在以后需要时重新创建。

答案 1 :(得分:0)

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

顺便说一句,即使由于内存条件较低而释放视图,或者由于您在其他tableviews中使用相同的单元格标识符而导致单元格出列,因此其视图控制器仍然存在,因此您不需要需要担心丢失你在那里设置的任何属性,除非你在didReceiveMemoryWarning中明确地做了一些事情来释放它。

答案 2 :(得分:0)

显然,我发现处理此问题的唯一方法是包含

- (void)didReceiveMemoryWarning;

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