【问题标题】:Push a nil view controller on deployed app在已部署的应用程序上推送一个 nil 视图控制器
【发布时间】:2011-08-30 16:33:32
【问题描述】:

我的问题很简单: 在 iPhone/iPad 模拟器上,当你推送一个 nil 视图控制器时,你会看到亲切的消息

Application tried to push a nil view controller on target

之后应用继续执行,就好像什么都没发生一样。这正是我想要的应用程序的行为类型(我有一个工厂方法,如果遇到创建实例的错误请求,则返回 nil)。

但是,我怀疑这是否会在真正的 iOS 设备上正常运行。由于我无法在这个开发的早期阶段进行部署,我想知道这个操作是否会导致崩溃,或者它会优雅地什么都不做(如预期的那样)。此外,如果它可以在 iOS 上运行,我会在审查过程中因为“做坏事”而被 Apple 扇耳光吗?

【问题讨论】:

    标签: iphone objective-c ios null pushviewcontroller


    【解决方案1】:

    当涉及到 Cocoa Touch 方法时,你不应该传递一个 nil 参数,除非参考文档明确声明一个 nil 参数是有效的。如果文档不明确,请不要依赖经验测试(在模拟器或其他方式中)来确定它是安全的。 Apple 可能会发布未来的操作系统更新,这会突然导致您的应用开始为现有用户崩溃。然后他们会在一两周内给你的应用差评,而 Apple 会审查你的修补程序。只是不值得冒险。

    pushViewController:animated: 的文档没有说明如果给定 nil 参数它将如何表现,因此请谨慎行事并在代码中测试 nil。

    【讨论】:

    • 谢谢,这正是我问题的本质所在。
    • @cduhn,嗯!很好的解释!
    【解决方案2】:

    这意味着您正在尝试推送尚未分配的视图控制器。在将视图控制器推送到导航控制器之前,请确保视图控制器不是 nil

    如果 nil 被推送到导航控制器堆栈中,应用程序只会抛出消息“应用程序试图将 nil 视图控制器推送到目标 ...”,在控制台中,它不会干扰应用程序的执行。但是,通过检查 nil 来避免任何意外行为总是好的。

    【讨论】:

    • 事实上,我精确地推 nil。问题是我可以接受,如果应用程序忽略此事件,我会很高兴。问题是这是否可行,或者我要检查我的工厂方法是否为零。
    • 没有。该应用程序不会干扰执行。但是最好通过检查 nil 来确保安全,以防止任何意外行为。
    猜你喜欢
    • 2014-09-16
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多