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 应用程序在手机上崩溃,但在模拟器上运行良好的主要内容,如果未能解决你的问题,请参考以下文章