1

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

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

 Str=[Str stringByAppendingString:TmpStr];  
4

3 回答 3

2

您可能想确认它实际上是内存问题并处理内存不足的情况。有关如何做到这一点,请参阅此 SO 帖子: iPhone - 如何处理内存不足的情况

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

查看Apple 的 Stream Programming Guide

从该指南:

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

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

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

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

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

于 2012-11-27T13:09:25.550 回答
0

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

于 2012-11-27T12:52:48.223 回答
0

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

于 2012-11-27T13:27:01.007 回答