NSUrl 未在 NSUserDefault 中存储为绝对字符串

Posted

技术标签:

【中文标题】NSUrl 未在 NSUserDefault 中存储为绝对字符串【英文标题】:NSUrl is not stored as absolutestring in NSUserDefault 【发布时间】:2011-11-16 17:04:59 【问题描述】:

我指的是Previous Post 用于将 iPod 库的 NSURL 存储在 NSUserDefault 中。但在应用关闭后,它不会存储在 NSUserDefault 中。

我正在使用其他 NSStrings 存储在 NSUserDefaults 中,这是完美的,但是当我将 NSUrl 存储为绝对字符串时.. 它不存储值。

可能是什么原因??

编辑

我用来保存 NSUserDefault 值的代码如下:

currentItem = [collection.items objectAtIndex:songCount];
songURL = [currentItem valueForProperty:MPMediaItemPropertyAssetURL];
[[NSUserDefaults standardUserDefaults] setObject:[currentItem valueForProperty:MPMediaItemPropertyTitle] forKey:@"songTitle"];
[[NSUserDefaults standardUserDefaults] setObject:[songURL absoluteString] forKey:@"songURL"];
avPlayer = [[AVPlayer alloc] initWithURL:songURL];
NSLog(@"songTitle: %@  songURL : %@",[[NSUserDefaults standardUserDefaults]objectForKey:@"songTitle"], songURL);

当我尝试保存 NSURL 时出现以下错误:

2011-09-13 18:47:23.258 Tabata Timer[933:707] songURL : ipod-library://item/item.mp3?id=-3715406019015217536
2011-09-13 18:47:23.258 Tabata Timer[933:707] *** -[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value 'ipod-library://item/item.mp3?id=-3715406019015217536' of class 'NSURL'.
2011-09-13 18:47:23.260 Tabata Timer[933:707] songTitle : Ghajini
2011-09-13 18:47:24.860 Tabata Timer[933:707] *** -[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value 'ipod-library://item/item.mp3?id=-3715406019015217536' of class 'NSURL'.
2011-09-13 18:47:24.963 Tabata Timer[933:707] songURL : ipod-library://item/item.mp3?id=-3715406019015217536
warning: Unable to read symbols for /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.3.5 (8L1)/Symbols/Developer/usr/lib/libXcodeDebuggerSupport.dylib (file not found).

【问题讨论】:

我们可以看到几行代码来存储 url 吗?另外,当你说它不存储值时,我假设存储的特定字符串只是 nil?您的代码有任何警告吗? 我已经添加了代码... 【参考方案1】:

我能想到的唯一可以解释的是,该 URL 至少部分是随机生成的,因此在您的应用删除对它的引用后无法加载。你是什​​么意思,“关闭”?有背景?还是真的终止了?

也可能是您应该将其保存为 string:yourURLString forKey:@"URL" 而不是对象。它可能会混淆应用程序。尝试NSLog 输出 URL 字符串,看看你得到了什么。让我知道它是什么。这将澄清事情。

【讨论】:

我已经添加了代码和错误。另外每次我的应用程序从头开始。我不允许我的应用在后台运行,它总是以新的方式启动。【参考方案2】:

如果你想存储 NSURL 那你为什么要把它转换成字符串并将它保存为字符串。这会增加你的工作量。

你可以试试这个:

NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];     
[defaults setURL:[NSURL URLWithString:@"http://www.google.com"] forKey:@"urlValue"];
[defaults synchronize];

NSURL *url=[defaults URLForKey:@"urlValue"];
NSLog(@"%@",url);

【讨论】:

为什么要使用[默认同步] ?? 实际上,此方法会定期自动调用并自动更新数据,但与此同时,如果它没有更新并且如果您使用它,您将获得旧结果而不是修改后的结果,因此手动调用它以便您可以立即保存您的数据。 而不是 [NSURL URLWithString:..] 我使用 [url absoluteURL] 其中 url 是我的 NSURL... 这个 [url absoluteURL] 有什么用。如果 url 是 NSURL 类型,那么你只需要做 [defaults setURL:url forKey:@"urlValue"];【参考方案3】:

你的字符串应该有属性声明...然后尝试将它存储在NSUserDefaults

【讨论】:

尝试创建一个NSURL实例并创建一个属性并合成它然后尝试存储...

以上是关于NSUrl 未在 NSUserDefault 中存储为绝对字符串的主要内容,如果未能解决你的问题,请参考以下文章

Maven 依赖项未在 Eclipse 中安装

我可以根据另一个 NSUserDefault 值保存 NSUserDefault 值吗?

读取 NSUserDefault 布尔值

写入 NSUserDefault 和 .plist 失败

NSUserDefault 更新公式

Xcode 中的 NSUserDefault