iOS 中 关于 NSUserDefault中存储可变数组的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 中 关于 NSUserDefault中存储可变数组的问题相关的知识,希望对你有一定的参考价值。

参考技术A 在开发过程中,可能需要将一个可变数组持久化存储在本地,用到NSUserDefault存储,但是要注意的是,取出该数组后,该数组变成了不可变数组,对其进行修改时容易引发崩溃。故应该将取出的数组转为可变数组后再去进行操作。

总结:NSUserDefaults 存储的对象全是不可变的(这一点非常关键,弄错的话程序会出bug),即存进NSUserDefaults的对象会变成不可变的,同样取出来的对象肯定是不可变的。

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

【中文标题】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实例并创建一个属性并合成它然后尝试存储...

以上是关于iOS 中 关于 NSUserDefault中存储可变数组的问题的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 Alamofire 时如何将令牌存储在 NSUserDefault 中?

NSUserDefault 无法在 iOS8 的扩展中保存和加载

IOS入门 SandBox Plist NSUserDefault

为啥不建议使用NSUserDefault存储大量数据

iOS NSUserDefaults synchronize存储遇到的坑