【问题标题】:Issue with NSString sizeNSString 大小问题
【发布时间】:2012-11-27 12:41:32
【问题描述】:

我想将文件中的大量字符分配给 NSString。我这样做了。它在 iOS 模拟器中对我来说工作正常。但是在iOS设备中崩溃了。我认为,长度超过了 NSString 内存。我可以意识到 NSString 限制会随着不同的设备和可用内存而改变。我的问题,是否有任何替代方法可以从文件中获取字符串并将其存储在运行时而不会出现内存问题? 或者如何查看 NSString 的可用长度?

这是我的代码。我在 NSString 中附加解析的字符串

 Str=[Str stringByAppendingString:TmpStr];  

【问题讨论】:

  • 为什么你需要一次在内存中的整个字符串?
  • 我们在谈论什么尺寸?
  • 是的。我需要用它在我的应用中找到一些计算。
  • ... 还有您打算如何使用该字符串?你将如何处理/使用它?
  • 它就像一本书。我想存储所有字符串并在翻页时使用该字符串。要计算页数,我想将所有字符串存储在一个字符串中。

标签: objective-c ios memory nsstring ios6


【解决方案1】:

您可能想确认这实际上是内存问题并处理内存不足的情况。有关如何执行此操作的信息,请参阅此 SO 帖子: iPhone - How to deal with low memory conditions

如果您尝试一次将书籍内容加载到 NSString 中,则可能会在内存受限的设备上遇到内存不足的情况。流允许您一次读取文件的一部分,并且仅将文件的当前部分保存在内存中。即使您可以成功地完全加载一些书籍,它也会变慢并且仍然消耗比应用程序需要的更多的内存 - 这将使您的应用程序成为第一个在内存不足的情况下被标记的应用程序。

结帐Apple's Stream Programming Guide

来自该指南:

Cocoa 包含三个流相关的类:NSStream、NSInputStream、 和 NSOutputStream。 NSStream 是一个抽象类,它定义了 所有流对象的基本接口和属性。 NSInputStream 和 NSOutputStream 是 NSStream 和 实现默认的输入流和输出流行为。你可以 为位于内存中的流数据创建 NSOutputStream 实例或 写入文件或 C 缓冲区;你可以创建 NSInputStream 实例 用于从 NSData 对象或文件中读取的流数据

编辑: 在您澄清您正在从 XML 加载的评论中。你仍然有同样的基本问题,你试图一次将某种“书”的大量内容加载到内存中。您在解析 xml 时附加了 tmp 字符串,因此效果是相同的。因此,您必须找到一种方法来逐步加载所需的书籍部分。幸运的是,您可以告诉 NSXMLParser 使用流。

这可能会有所帮助: Using NSXMLParser initWithStream: no parser delegate methods received

我还刚刚发现了这个可能有帮助的主题的 SO 帖子:Objective-C: Reading a file line by line

不确定应用中的详细信息,但您可以流式传输到您需要的当前数据(以及两侧的几页),或者您甚至可以将内容流式传输并拆分为一些临时文件中的“页面”磁盘作为一种“页面缓存”。

【讨论】:

  • 谢谢。但我不是一次将所有字符串附加到 NSString 。实际上我使用 NSXMLParser 从 Xml 文件中获取字符串所以我不是一次附加所有字符串。
  • 好的 - 在问题中很高兴知道:) 编辑答案
  • 我想从本地目录解析 XML 文件。我已经从我的网络服务器下载了它。那我可以用这个流媒体概念吗???
  • 是的,请参阅上面的“使用 NSXMLParser initWithStream”链接。这意味着当解析器遍历它并调用你的回调时,整个文件不会被加载到内存中。但这也意味着您不能在这些回调中连接字符串,因为这会有效地将其全部加载到内存中到您的字符串中。这意味着您必须流式传输(并丢弃)到您想要的数据页面(必须记住您离开的位置)并在该页面之后停止。您可以在磁盘的任一侧缓存到每个页面的文件中(页面缓存),或者您可以处理一次并将文件分成块。
  • 另一个选项是在下载后将您从服务器获取的源内容拆分或在本地拆分为较小的文件(如果您无法控制服务器上的内容)。
【解决方案2】:

当您的应用程序崩溃时,您能分享控制台日志吗? 尽管我认为这不是真正的问题,但问题有所不同。 同时,您可以尝试使用数据库进行存储。 并且,如果可能,请显示您尝试分配字符串的行。

【讨论】:

  • 这就像内存问题。应用程序崩溃了。但是,没有控制台日志。
  • 你激活了你的僵尸,试试看。可能的情况是该字符串被解除分配或可能是其他组件,因此请检查。 :)
  • 另外,根据您的说法,在模拟器中它工作正常,所以请从那里提及字符串的长度。无论如何,由于一些工作,我不得不让......但待会见。 :)
【解决方案3】:

使用 NSMutableString 代替 NSString。这可能对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    相关资源
    最近更新 更多