如何从NSUserDefaults中拉出一个字符串

时间:2010-01-16 00:46:58

标签: iphone objective-c object nsstring nsuserdefaults

好吧,我有我的代码,我相信我已经将崩溃的bug缩小到了一个部分。加载视图后,我的代码加载NSUserDefaults并从中拉出字符串。然后它与teh字符串一起使用。问题是,我不知道如何拉出弦。

以下是相关代码:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSString *nameOne = [prefs stringForKey:@"playerOne"];
NSString *nameTwo = [prefs stringForKey:@"playerTwo"];

//do stuff with the strings

[nameOne release];
[nameTwo release];

以下是我将字符串放入NSUserDefaults时的代码,在另一个视图上:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSString *tempName = [[NSString alloc] initWithFormat:@"You"];
[prefs setObject:tempName forKey:@"playerOne"];
NSString *tempName2 = [[NSString alloc] initWithFormat:@"Opponent"];
[prefs setObject:tempName2 forKey:@"playerTwo"];
[prefs synchronize];

我已将问题隔离到我从NSUserDefaults中取出字符串的位置。我觉得我错了,但我不知道怎么做。使用StringForKey可能是错误的......或者没有分配空间?我不确定问题是什么,我已经尝试修复它但无济于事。帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

您可能想要检查从NSUserDefaults获得的字符串是autorelease d。我似乎记得他们是。

答案 1 :(得分:1)

我相信你应该复制下面的字符串(或删除释放行)

NSString *nameOne = [[prefs stringForKey:@"playerOne"] copy];
NSString *nameTwo = [[prefs stringForKey:@"playerTwo"] copy];

答案 2 :(得分:0)

添加Frank Schmitt的答案:

一般的经验法则是,如果您没有在方法名称中看到alloc或copy,则可以假设调用者没有所返回对象的所有权,除非它显式调用retain。因此,返回的对象通常会被放置在自动释放池中。

因此在这种情况下“stringForKey”调用函数没有返回值的所有权,因此它不需要调用release。

如果你想在调用函数离开作用域后保留字符串,你需要调用retain。 (虽然根据你的发布声明来判断你没有)

我会熟悉: http://developer.apple.com/iphone/library/documentation/General/Conceptual/DevPedia-CocoaCore/MemoryManagement.html