Swift:观察NSUserDefaults时的EXC_BAD_ACCESS

时间:2014-11-09 16:43:02

标签: ios swift nsuserdefaults

我正在使用Swift编写iOS应用,并希望收到有关NSUserDefault更改的通知。当我注册观察者并尝试之后修改NSUserDefault数据时,我总是得到以下运行时错误:EXC_BAD_ACCESS

我已经创建了一个示例应用来证明问题:

import UIKit

class ViewController: UIViewController {

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector(observeUserDefaults()), name:
                    NSUserDefaultsDidChangeNotification, object: nil)
    }

    deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self, name: NSUserDefaultsDidChangeNotification, object: nil)
    }

    @IBAction func buttonPressed(sender: UIButton) {
        let userDefaults = NSUserDefaults.standardUserDefaults()
        userDefaults.setObject("test", forKey: "test")
        userDefaults.synchronize()
    }

    func observeUserDefaults() {
        NSLog("observeUserDefaults() called")
    }

}

方法" buttonPressed()"链接到故事板上的UI按钮。只要我按下按钮,应用就会停在" userDefaults.setObject(" test",forKey:" test")"错误" EXC_BAD_ACCESS(代码= 1,地址= 0x0)"如果我不添加观察者,代码运行正常。

我使用Objective-C创建了相同的应用程序,它运行没有任何问题:

#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(observeUserDefaults) name:NSUserDefaultsDidChangeNotification object:nil];
}

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSUserDefaultsDidChangeNotification object:nil];
}

- (IBAction)buttonPressed:(UIButton *)sender {
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setObject:@"test" forKey:@"test"];
    [userDefaults synchronize];
}

- (void)observeUserDefaults {
    NSLog(@"observeUserDefaults() called");
}

@end

任何想法Swift应用程序出了什么问题?谢谢你的帮助!

我正在使用iOS 8.1 SDK运行Xcode 6.1。

问候, 菲利克斯

1 个答案:

答案 0 :(得分:2)

中的主要错误
addObserver(self, selector: Selector(observeUserDefaults()), ...)

调用方法而不是提供其选择器名称:

addObserver(self, selector: Selector("observeUserDefaults"), ...)

而且,选择器 应该是一个采用通知对象的方法:

- (void)observeUserDefaults(notification: NSNotification) {
    NSLog(@"observeUserDefaults() called");
}

然后注册

NSNotificationCenter.defaultCenter().addObserver(self,
                   selector: Selector("observeUserDefaults:"),
                   name: NSUserDefaultsDidChangeNotification,
                   object: nil)