【问题标题】:How to pull a string out from NSUserDefaults如何从 NSUserDefaults 中提取字符串
【发布时间】:2010-01-16 00:46:58
【问题描述】:

好的,我有我的代码,并且我相信我已将崩溃错误缩小到一个部分。加载视图后,我的代码会加载 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 可能是错误的......或者没有分配空间?我不确定是什么问题,我已经尝试修复它但无济于事。帮助将不胜感激!

【问题讨论】:

    标签: iphone objective-c object nsstring nsuserdefaults


    【解决方案1】:

    您可能想检查从NSUserDefaults 获得的字符串是否为autoreleased。我似乎记得他们是。

    【讨论】:

    • 好吧,我删除了“发布”声明,这似乎解决了问题。谁知道!感谢您的帮助!!有没有办法事先知道是否要自动发布某些内容?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2016-11-05
        • 2012-03-03
        • 2020-11-20
        • 2011-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-24
        • 2012-10-24
        相关资源
        最近更新 更多