我正在使用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。
问候, 菲利克斯
答案 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)