iOS 应用程序在手机上崩溃,但在模拟器上运行良好

Posted

技术标签:

【中文标题】iOS 应用程序在手机上崩溃,但在模拟器上运行良好【英文标题】:iOS App Crashes on Phone but works fine on simulator 【发布时间】:2015-02-07 13:08:33 【问题描述】:

我有以下代码:

var displayValue: Double
    get
        println("display.text =\(display.text!)")
        return NSNumberFormatter().numberFromString(display.text!)!.doubleValue
    
    set
        display.text = "\(newValue)"
        userIsInTheMiddleOfTypingANumber = false;
    

它在模拟器中运行良好。但是当我在手机上尝试它时它崩溃了。 这是控制台:

digit= 3
display.text =3
operandStack =[3.0]
digit= 2
display.text =2
operandStack =[3.0, 2.0]
display.text =6.0
fatal error: unexpectedly found nil while unwrapping an Optional value

这一行:

NSNumberFormatter().numberFromString(display.text!)!

返回 nil 导致应用程序崩溃,因为它无法解开可选项。我真的不知道怎么了。我正在关注 iTunes U 中的一些教程。

任何帮助将不胜感激。

【问题讨论】:

可能是因为 display.text 等于 nil。这就是它变得混乱的原因。 @AshrafTawfeeq 它没有返回我打印的 nil,它的值为 6.0 【参考方案1】:

试试:

get
    println("display.text =\(display.text!)")
    let formatter = NSNumberFormatter()
    formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
    return formatter.numberFromString(display.text!)!.doubleValue

因为NSNumberFormatter 默认使用设备区域设置,所以小数点分隔符可能不是"."。例如:

let formatter = NSNumberFormatter()
formatter.locale = NSLocale(localeIdentifier: "ar-SA")
print(formatter.decimalSeparator!) // -> outputs "٫"
formatter.numberFromString("6.0") // -> nil

使用此类语言环境的格式化程序无法解析像"6.0" 这样的字符串。因此,如果您希望格式化程序的结果一致,则应明确指定 locale

至于en_US_POSIX语言环境,见the document:

在大多数情况下,选择的最佳语言环境是en_US_POSIX,这是一种专门设计用于生成美国英语结果的语言环境,无论用户和系统偏好如何。 en_US_POSIX 在时间上也是不变的(如果美国在未来的某个时候改变了日期格式,en_US 将改变以反映新的行为,但en_US_POSIX 不会),以及平台之间( en_US_POSIX 在 iPhone OS 上的工作方式与在 OS X 上和在其他平台上的工作方式相同。

【讨论】:

这正是问题所在。无论如何有更好的解决方案吗?喜欢一劳永逸地设置语言环境? 也许,您可能想要一个 make 单例类,或保存缓存格式化程序的全局常量。但是,您应该知道NSNumberFormatter 不是线程安全的。 哇,谢谢。多么微妙的错误......只发生在其他人的设备上,无法重现等等。

以上是关于iOS 应用程序在手机上崩溃,但在模拟器上运行良好的主要内容,如果未能解决你的问题,请参考以下文章

当我在真实设备中打开活动时应用程序崩溃

iOS 应用程序本地化在模拟器上工作,但在手机上不工作

应用程序在模拟器上运行良好,但在真实设备上崩溃

IOs App 在模拟器上运行但在设备上崩溃(主要使用 AVFoundation)

AVPlayer 导致模拟器崩溃但在设备上运行良好

Android 小部件在模拟器中运行良好,但在手机上它变成了 Google App 小部件