0

我正在尝试将值保存到NSUserDefaults. 下面是我的代码。

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setValue:theUrl forKey:PREFS_FEED_URL];

我收到的错误是message sent to deallocated instance 0x9495b00.

这是在模拟器上运行的。我已经验证了 prefs 变量不是nil.

编辑:下面的完整方法:

- (void) exeSave {
    NSString *theUrl = [util isEmptyStr:rssFeedUrl.text] ? nil : [util trimString:rssFeedUrl.text];
    if (!theUrl) {
        [util showToast:@"The URL entered was empty" duration:1];
        return;
    }

    NSURL *url = [[NSURL alloc] initWithString:theUrl];
    if (!url) {
        [util showToast:@"The URL entered was invalid" duration:1];
        return;
    }
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    [prefs setObject:theUrl forKey:PREFS_FEED_URL];
    [prefs synchronize];
}

编辑 2:我刚刚意识到错误消息指的是以前的ViewController- my RssViewController. 上面的方法在我的EditSettingsViewController. 我对Objective C的了解还不够,无法弄清楚为什么会发生这种情况或如何发生这种情况。

编辑 3:经过进一步检查,当我删除观察到NSUserDefaults.

以下代码在我的RssViewController

viewDidLoad方法中,我有以下内容:

[[NSUserDefaults standardUserDefaults] addObserver:self forKeyPath:@"feed_url" options:NSKeyValueObservingOptionNew context:nil];

我在方法中删除了观察者dealloc

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    self.navigationController.sideMenu.menuStateEventBlock = nil;
}

我覆盖了以下方法。

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if ([keyPath isEqual:PREFS_FEED_URL]) {
        NSLog(@"user prefs: url changed");
        [self refresh];
    }
}

调试器永远不会到达该observeValueForKeyPath方法。

4

1 回答 1

2

使用setObject:forKey:时必须是以下数据类型之一。(来自苹果文档):

The value parameter can be only property list objects: NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary. For NSArray and NSDictionary objects, their contents must be property list objects.

您应该使用以下两种方法:

setURL:forKey:URLForKey:

在此处查看文档:NSUserDefaults 文档

以下是当前支持的获取/设置NSUserDefaults值的方法:

获取默认值

arrayForKey:
boolForKey:
dataForKey:
dictionaryForKey:
floatForKey:
integerForKey:
objectForKey:
stringArrayForKey:
stringForKey:
doubleForKey:
URLForKey:

设置默认值

setBool:forKey:
setFloat:forKey:
setInteger:forKey:
setObject:forKey:
setDouble:forKey:
setURL:forKey:

关于您的编辑,您在 上设置了 KVO NSUserDefaults,但您没有正确取消注册它们。当您在对象上使用 KVO 时,您必须为该对象取消注册 KVO ,而不仅仅是调用removeObserver:. NSNotificationCenter将以下内容添加到您的dealloc方法中:

[[NSUserDefaults standardUserDefaults] removeObserver:self forKeyPath:@"feed_url" context:NULL];

在这种情况下,最有可能发生的事情是您没有取消注册 KVO,因此其他事情会改变NSUserDefaults它,它会尝试调用您现在的 dealloc`d 视图控制器。

于 2013-04-03T00:02:04.900 回答