好吧,我有我的代码,我相信我已经将崩溃的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可能是错误的......或者没有分配空间?我不确定问题是什么,我已经尝试修复它但无济于事。帮助将不胜感激!
答案 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。 (虽然根据你的发布声明来判断你没有)