Unwind Segue nil参数错误

时间:2013-07-21 17:11:55

标签: iphone ios objective-c ios6 segue

我是ios开发的新手,我正在尝试创建一个简单的测试应用程序,允许用户在他们的药柜中记录和编辑他们的药片。

我正在使用ios 6.1,arc和segues。

错误背景:

因此,用户在他们的药柜中有一个药丸清单,他选择了一个,并且一个segue将他带到一个视图控制器,向他提供有关该药丸的信息。然后,他可以选择编辑将他分割到另一个视图控制器的信息,该视图控制器显示他可以编辑的文本区域中的所有当前信息,然后单击一个保存按钮,启动到原始药柜的放松信号。

我得到的错误就是这个。用户可以编辑信息并成功保存并弹回机柜。但是当他再次编辑药丸时,我得到错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString appendString:]: nil argument'

我做了一些挖掘,我发现了正在发生的事情。在unwind segue方法中,我成功设置了药丸的属性以匹配editPillView控制器的文本字段中的文本。例如,我有一颗药丸,它属于周杰伦。但后来我编辑它并说它属于Raf。使用断点,我可以在MedicineCabinetViewController的unwind segue方法中看到从Jay到Raf的字符串更改。但是一旦unwind segue完成,我看到在某些时候,在apple的代码中字符串被设置为nil(可能是因为arc释放内存,因为不再需要EditPillViewController而且pill的所有者属性然后变成空指针)。然后当用户再次点击药丸时,pillInfoViewController正在尝试使用空指针和BOOM。

我已经尝试了很多解决方案来尝试保持字符串保持raf,例如使用NSString复制方法。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

当您执行展开segue时,除非您对它们有强烈的引用,否则将取消分配您正在展开的控制器,但不包括您正在展开的控制器。因此,当控制器被释放时,如果它位于MedicineCabinetViewController中,则该药丸的所有者属性将消失。

有几种方法可以解决此问题。一种方法是使用代码而不是使用segue在您的应用程序中导航,这样您就可以保留对您创建的控制器的引用,如果它还不存在则只分配一个。

另一种方法是拥有一个单例的模型类,它将适用于应用程序的生命周期。这样,有关药物的所有数据都将是这个单例类中某些对象(或对象)的属性。