writeToFile 失败 - 我如何调试它为啥失败(啥工具)?

Posted

技术标签:

【中文标题】writeToFile 失败 - 我如何调试它为啥失败(啥工具)?【英文标题】:writeToFile fails - how do I debug WHY it fails (what tools)?writeToFile 失败 - 我如何调试它为什么失败(什么工具)? 【发布时间】:2011-09-22 19:00:43 【问题描述】:

我从 JSON(使用 SBJson)获得一个 NSDictionary,我想存储它。我正在使用

[liveData writeToFile:localFilePath atomically:YES]

它失败了。数据 看起来 像它所有的 NSString、NSDictionary 和 NSArray(“原子地:YES”要求)。我在其他地方使用了相同的 localFilePath。

所以我的问题是:如何找出问题所在?我可以使用哪些工具来了解 writeToFile 失败的原因?日志不显示错误消息。

【问题讨论】:

你NSLogged你的localFilePath看看值是多少?你确定你给它一个唯一的名字来保存吗? 我同意问题可能出在您的路径上,您能否包含该代码? 我已经记录了我的 localFilePath,并且我还在代码中的其他地方使用它来存储其他内容(仅更改文件名 - 它是 NSTemporaryDirectory() 加上文件名)所以我很确定不是这个。但实际上我的问题是:我如何调试这个问题——我怎样才能找到更多关于失败的信息?记录器之外的 xcode 中是否有错误代码或某些调试工具可以帮助我确定它?还是我只需要通过反复试验来确定它? 【参考方案1】:

可能有多种原因:

您正在写入的路径错误、不可写(您没有对其的写入权限)或父目录不存在(如果localFilePath 是“/path/to/file.plist”但目录“/path/to/”不存在,会失败) liveData 字典确实包含不是 PropertyList 对象的对象。只有 NSDataNSDateNSNumberNSStringNSArrayNSDictionary 对象可以写入属性列表文件(并且 writeToFile:atomically:do 写入plist 文件,因此字典 do 必须仅包含 PList 对象才能使该方法成功)

【讨论】:

另外值得注意的是,如果您的字典中有NULL 值,writeToFile 将失败。 字典中 NSNull 类的任何值都会失败。因此,在放入字典之前明确检查所有值。就我而言,我正在从 JSON(服务器数据)读取值,这是此类值的良好来源。【参考方案2】:

我知道这是一个 2 年前的问题。但是由于我刚刚遇到同样的问题并在这里修复了它,这就是我发现的。我敢打赌你的 NSDictionary 有一些不是 NSStrings 的键。

而不是像这样键入:

[_myDictionay setObject:thisObj forKey:[NSNumber numberWithInt:keyNumber]];

键喜欢:

[_myDictionay setObject:thisObj forKey:[NSString stringWithFormat:@"%i",numberWithInt:keyNumber]];

这解决了我的问题。

上面的方式不能保存到plist文件中。

由于您从 JSON 转换中获取信息,因此其中可能有一些对象或键是 NSNumber。你必须转换它们。但这很痛苦。

因此,既然您已经在 json 中拥有它,只需将其作为 json 字符串完整存储在 @"data" 键中,然后在稍后将 plist 加载回数组或 dict 时重新展开它。

【讨论】:

这解决了我的问题(在我的情况下,我的密钥是NSDates),但是,它仍然没有回答可以调试哪些工具的问题。如果有一些我可以戳代码的东西会说“NSDate 不是写入 plist 文件的有效密钥”之类的东西,那就太好了。【参考方案3】:

我尝试将 NSDictionary 保存到磁盘,其中只有键和值的数字。将键切换为 NSString 有效,但当它们的键为 NSNumber 时无效。键必须是 NSString 吗?

编辑:我现在更清楚它可以是任何响应散列的对象;但通常是 NSString 的。

【讨论】:

是的。见我上面的回答。 叹息...必须从 NSNumber 转换为 NSString 才能将数据保存到文件中。感谢您的提示。

以上是关于writeToFile 失败 - 我如何调试它为啥失败(啥工具)?的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 1.0.22 对象保存失败 - 为啥?如何调试这个?

通过共享扩展从图库中保存照片时 NSData WriteToFile 失败

ios 调用writeToFile将图片保存到本地一直失败的解决方案

为啥 cv::meanStdDev 函数在调试时失败并出现异常

iOS writeToFile 保存文件到沙盒某目录失败的解决方案

为啥上传图片到 Blobstore 后回调失败?