Objective c 字符串大小问题

Objective c 字符串大小问题,objective-c,ios,memory,nsstring,ios6,Objective C,Ios,Memory,Nsstring,Ios6,我想将文件中的大量字符分配给NSString。我做到了。它在iOS模拟器中运行良好。但在iOS设备上崩溃了。我认为,长度超过了NSString内存。我可以意识到NSString限制将随着不同的设备和可用内存而改变。我的问题是,是否有其他方法可以从文件中获取字符串并将其存储在运行时而不会出现内存问题?。 或者如何检查NSString的可用长度 这是我的密码。我正在NSString中追加已解析的字符串 Str=[Str stringByAppendingString:TmpStr]; 当您的

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

这是我的密码。我正在NSString中追加已解析的字符串

 Str=[Str stringByAppendingString:TmpStr];  

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

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

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

结帐

根据该指南:

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

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

这可能有助于:

我还发现了这篇关于这个主题的文章,可能会有所帮助:


不确定应用程序中的详细信息,但您可以将当前所需的数据流化(两边各有几页),或者您甚至可以在磁盘上的一些临时文件中将内容流化并拆分为“页面”,作为“页面缓存”的一种。请使用NSMutableString而不是NSString。那可能对你有帮助

为什么你需要一次把整个字符串存储在内存中?我们说的是什么尺寸?耶。我需要使用它在我的应用程序中找到一些计算。。。。你打算如何使用这个字符串?你将如何处理/使用它?它就像一本书。我想存储所有字符串,并在翻页时使用该字符串。为了计算页数,我想把所有的字符串存储在一个字符串中,就像内存问题一样。应用程序scrashed。但是,没有控制台日志。如果您激活了僵尸,请尝试。可能情况是字符串被释放,或者可能是其他组件,所以只需检查。:)另外,根据你的话,在模拟器中,它工作得很好,所以请从那里你提到字符串的长度。无论如何,由于一些工作,我不得不让……但我们以后再见。:)谢谢但我并不是一次向NSString追加所有字符串。实际上,我是使用NSXMLParser从Xml文件中获取字符串的,因此我不会一次追加所有字符串。好的-最好在问题中知道:)编辑应答我想从本地目录解析Xml文件。我已经从我的网络服务器下载了它。因此,我可以使用这个流概念吗???是的,请参阅上面的“使用NSXMLParser initWithStream”链接。这意味着在解析器遍历整个文件并调用回调时,不会将其加载到内存中。但这也意味着您不能在这些回调中压缩字符串,因为这样可以有效地将其全部加载到内存中并保存到字符串中。这意味着您必须将数据流(并丢弃)到您想要的页面(必须记住您离开的位置),然后在该页面之后停止。您可以在磁盘的任一侧将其缓存到每页一个文件(页面缓存)中,也可以处理一次并将文件分块。另一个选项是在下载后在本地将从服务器获取的源内容拆分为较小的文件(如果您无法控制服务器上的内容)。