【问题标题】:Unwind Segue nil argument error展开 Segue nil 参数错误
【发布时间】:2013-07-21 17:11:55
【问题描述】:

我是 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。但是一旦展开 segue 完成,我看到在某些时候,字符串在苹果的代码中被设置为 nil(可能是因为 arc 正在释放内存,因为不再需要 EditPillViewController 并且药丸的所有者属性然后变为空指针)。然后当用户再次单击药丸时,药丸信息视图控制器正在尝试使用空指针和 BOOM。

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

【问题讨论】:

    标签: iphone ios objective-c ios6 segue


    【解决方案1】:

    当您执行 unwind segue 时,除非您对它们有强烈的引用,否则从您正在展开的那个控制器返回到但不包括您正在展开的那个控制器的任何控制器都将被释放。因此,药丸的所有者属性(如果它在 MedicineCabinetViewController 中)将在控制器被释放时消失。

    有几种方法可以解决此问题。一种方法是使用代码而不是使用 segue 在您的应用程序中导航,因此您可以保留对您创建的控制器的引用,并且仅在它尚不存在时分配一个。

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

    【讨论】:

    • 这是一个完美的答案!谢谢!我通过使用强引用来修复它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多