我想将大量字符从文件分配到NSString。我做到了它在iOS模拟器中对我很好。但在iOS设备中崩溃了。我认为,长度超过NSString内存。我可以意识到NSString限制将随着不同的设备和可用内存而改变。我的问题,是否有任何替代方法从文件中获取字符串并将其存储在运行时没有内存问题? 或者如何检查NSString的可用长度?
这是我的代码。我将解析后的字符串附加到NSString
中 Str=[Str stringByAppendingString:TmpStr];
答案 0 :(得分:2)
您可能想确认它实际上是内存问题并处理内存不足的情况。请参阅此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
我也刚刚在这个主题上找到了这篇可能有用的帖子:Objective-C: Reading a file line by line
不确定您的应用中的详细信息,但您可以流式传输到您需要的当前数据(以及两侧的几页),或者您甚至可以将内容流式传输并拆分为某些临时文件中的“页面”磁盘作为“页面缓存”的一种。
答案 1 :(得分:0)
请在应用崩溃时分享控制台日志吗? 我认为这不是真正的问题,问题是不同的。 同时,您可以尝试使用数据库进行存储。 并且,如果可能的话,请显示您尝试分配字符串的行。
答案 2 :(得分:0)
使用NSMutableString而不是NSString。这可能对你有帮助!