2

好吧,我有我的代码,我相信我已经将崩溃错误缩小到一个部分。加载视图后,我的代码会加载 NSUserDefaults 并从中提取字符串。然后它与字符串一起工作。问题是,我不确定如何拉出绳子。

下面是相关代码:

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 可能是错误的......或者没有分配空间?我不确定是什么问题,我已经尝试修复它但无济于事。帮助将不胜感激!

4

3 回答 3

2

你可能想检查你得到的字符串是否NSUserDefaultsautoreleased。我似乎记得他们是。

于 2010-01-16T00:50:40.477 回答
1

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

NSString *nameOne = [[prefs stringForKey:@"playerOne"] copy];
NSString *nameTwo = [[prefs stringForKey:@"playerTwo"] copy];
于 2010-01-16T00:51:30.393 回答
0

添加弗兰克施密特的答案:

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

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

如果你想在调用函数离开范围后保留字符串,你需要调用retain。(虽然从你的发布声明来看你没有)

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

于 2010-01-16T03:53:27.220 回答