应用程序崩溃与EXC_BREAKPOINT错误

我有一个应用程序,我在Xcode 7.2中。 我有一个主菜单,有一个button,有一个继续到设置视图控制器。 设置视图控制器有以下代码,每当我到达该视图控制器,它崩溃与EXC_BREAKPOINT错误。 有趣的是,这只发生在我运行iOS 7的iPhone 4上。它不会在运行iOS 9的iOS模拟器iPhone 6中崩溃。

无论如何,这里是代码。

// // SettingsController.swift // Arbor Hills iOS // // Created by Andrew on 11/22/15. // Copyright © 2015 Arbor Hills Vet. All rights reserved. // import UIKit class SettingsController: UITableViewController { @IBOutlet weak var username: UITextField! @IBOutlet weak var password: UITextField! @IBOutlet weak var notifications: UISwitch! override func viewDidLoad(){ super.viewDidLoad() let defaults = NSUserDefaults.standardUserDefaults() let dusername = defaults.valueForKey("username")! let dpassword = defaults.valueForKey("password")! let dnotifications = defaults.valueForKey("notifications")! username!.text = String(dusername) password!.text = String(dpassword) if(dnotifications as! Bool == true){ notifications.setOn(true, animated: true) }else{ notifications.setOn(false, animated:true) } } @IBAction func saveUsername(sender: AnyObject) { let defaults = NSUserDefaults.standardUserDefaults() defaults.setObject(username.text!, forKey: "username") } @IBAction func savePassword(sender: AnyObject) { let defaults = NSUserDefaults.standardUserDefaults() defaults.setObject(password.text!, forKey: "password") } @IBAction func notificationsModified(sender: AnyObject) { let defaults = NSUserDefaults.standardUserDefaults() defaults.setObject(notifications.on, forKey: "notifications") } } 

如果未注册默认值,则NSUserDefaults将返回nil 。 当你打开一个nil值,你会得到一个运行时错误(崩溃)。

Applebuild议将任何键的默认值作为占位符注册,直到首次保存自定义值。

AppDelegate添加applicationDidFinshLaunching

 let defaults = NSUserDefaults.standardUserDefaults() let defaultValues = ["username" : "", "password" : "", "notifications" : false] defaults.registerDefaults(defaultValues) 

这注册空string和一个布尔值false
然后,您可以安全地检索值

 let defaults = NSUserDefaults.standardUserDefaults() let dusername = defaults.stringForKey("username")! let dpassword = defaults.stringForKey("password")! let dnotifications = defaults.boolForKey("notifications") 

对于String值总是使用stringForKey ,对于Bool值总是使用stringForKey
永远不要使用valueForKeyNSUserDefaults这是一个特殊的KVC方法。

那么这个代码也可以简化:

 username!.text = dusername password!.text = dpassword notifications.setOn(dnotifications, animated: true) 

当写入用户默认值时,使用setBool:forKey作为Bool值,但是没有String等价物, setObject:forKey是正确的。

您不应该使用valueForKey从NSUserDefaults中获取对象。 这是一个键值编码方法。 (请参阅NSKeyValueCoding上的链接,您需要objectForKey,并且您需要检查nil后缀:

 let defaults = NSUserDefaults.standardUserDefaults() if let dusername = defaults.objectForKey("username") as String { //code to use the username } else { //code to handle the case where there is no username }