xcode 应用程序因 EXC_BREAKPOINT 错误而崩溃
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/33856563/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
App Crashing with EXC_BREAKPOINT Error
提问by vadian
I have an app I am making in Xcode 7.2. I have a main menu with a button that has a segue going to a settings view controller. The settings view controller has the following code and every time I get to that view controller it crashes with an EXC_BREAKPOINT error. The funny thing is that this only happens on my iPhone 4 running iOS 7. It does not crash in the iOS Simulator iPhone 6 running iOS 9.
我有一个在 Xcode 7.2 中制作的应用程序。我有一个带有按钮的主菜单,该按钮有一个转到设置视图控制器的 segue。设置视图控制器具有以下代码,每次我到达该视图控制器时,它都会因 EXC_BREAKPOINT 错误而崩溃。有趣的是,这只发生在我运行 iOS 7 的 iPhone 4 上。它不会在运行 iOS 9 的 iOS 模拟器 iPhone 6 中崩溃。
Anyways, here is the code.
无论如何,这是代码。
//
// 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")
}
}
回答by vadian
NSUserDefaults
returns nil
for an object if no default value is registered. When you unwrap a nil
value you'll get an runtime error (crash).
NSUserDefaults
nil
如果没有注册默认值,则返回一个对象。当您解开一个nil
值时,您将收到一个运行时错误(崩溃)。
Apple recommends to register a default value for any key as a placeholder until a custom value is saved the first time.
Apple 建议将任何键的默认值注册为占位符,直到第一次保存自定义值。
In AppDelegate
add in applicationDidFinshLaunching
在AppDelegate
添加applicationDidFinshLaunching
let defaults = NSUserDefaults.standardUserDefaults()
let defaultValues = ["username" : "", "password" : "", "notifications" : false]
defaults.registerDefaults(defaultValues)
Swift 3+
斯威夫特 3+
let defaults = UserDefaults.standard
let defaultValues : [String : Any] = ["username" : "", "password" : "", "notifications" : false]
userDefaults.register(defaults: defaultValues)
That registers empty strings and a boolean false
.
Then you can safely retrieve the values
这会注册空字符串和一个 boolean false
。
然后您可以安全地检索值
let defaults = NSUserDefaults.standardUserDefaults()
let dusername = defaults.stringForKey("username")!
let dpassword = defaults.stringForKey("password")!
let dnotifications = defaults.boolForKey("notifications")
Swift 3+
斯威夫特 3+
let defaults = UserDefaults.standard
let dusername = defaults.string(forKey:"username")!
let dpassword = defaults.string(forKey:"password")!
let dnotifications = defaults.bool(forKey:"notifications")
Use always stringForKey
for String
values and boolForKey
for Bool
values.
Neveruse valueForKey
with NSUserDefaults
which is a special KVC method.
总是使用stringForKey
的String
值,并boolForKey
为Bool
值。
切勿使用valueForKey
with NSUserDefaults
which 是一种特殊的 KVC 方法。
Then this code could be also simplified:
那么这段代码也可以简化:
username!.text = dusername
password!.text = dpassword
notifications.setOn(dnotifications, animated: true)
When writing to user defaults use setBool:forKey
for the Bool
value, however there is no String
equivalent, setObject:forKey
is correct.
当写入用户默认值时,使用setBool:forKey
该Bool
值,但是没有String
等效项,setObject:forKey
是正确的。
回答by Duncan C
You should not use valueForKey to fetch objects from NSUserDefaults. Thats a key-value coding method. (See the link on NSKeyValueCoding. you want objectForKey, and you need to check for nil afterwords:
你不应该使用 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
}