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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-15 08:14:20  来源:igfitidea点击:

App Crashing with EXC_BREAKPOINT Error

iosiphonexcodeswift

提问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

NSUserDefaultsreturns nilfor an object if no default value is registered. When you unwrap a nilvalue you'll get an runtime error (crash).

NSUserDefaultsnil如果没有注册默认值,则返回一个对象。当您解开一个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 AppDelegateadd 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 stringForKeyfor Stringvalues and boolForKeyfor Boolvalues.
Neveruse valueForKeywith NSUserDefaultswhich is a special KVC method.

总是使用stringForKeyString值,并boolForKeyBool值。
切勿使用valueForKeywith NSUserDefaultswhich 是一种特殊的 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:forKeyfor the Boolvalue, however there is no Stringequivalent, setObject:forKeyis correct.

当写入用户默认值时,使用setBool:forKeyBool值,但是没有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
}