首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有效地使用NSData

有效地使用NSData
EN

Stack Overflow用户
提问于 2011-09-25 12:43:36
回答 2查看 1.7K关注 0票数 2

我有一个操作音频文件的代码,首先把所有的音频文件数据放在NSData变量中。但它有时会崩溃,因为它使用了大量的RAM

代码语言:javascript
复制
 NSData *data1 = [NSData dataWithContentsOfFile: someFile];

我已经使用Instruments检查了所有内容都被释放了,以及RAM是如何使用的,我发现当音频文件太大时,它有时会崩溃。有没有一种方法可以将数据存储在较小的位中,或者存储在闪存中,或者其他任何方式,这样我就可以在不超过iPhone上最大内存的情况下处理大文件。

例如,我正在使用NSData连接两个文件,如下所示:

代码语言:javascript
复制
 [data1 appendData: data2];

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-25 13:32:47

有一种方法可以将数据存储在较小的位中,或者存储在闪存中,或者以任何其他方式存储,这样我就可以在不超过iPhone上最大内存的情况下处理大文件。

当然了。这个问题比NSData更根本--你通常不会将一组音频文件(全部)加载到内存中,特别是当设备内存非常小时。即使在osx上加载整个文件也是不典型的,在osx上,您可以有足够的内存(除非知道文件非常小)。这就是为什么音频文件apis允许以块为单位(参考:ExtAudioFileReadAudioFileReadPackets)进行读写。

票数 1
EN

Stack Overflow用户

发布于 2011-09-25 13:00:59

试试这个(来自这个SO问题):

代码语言:javascript
复制
NSData* myBlob;
NSUInteger length = [myBlob length];
NSUInteger chunkSize = 100 * 1024;
NSUInteger offset = 0;
do {
    NSUInteger thisChunkSize = length - offset > chunkSize ? chunkSize : length - offset;
    NSData* chunk = [NSData dataWithBytesNoCopy:(void*)[myBlob bytes] + offset
                                         length:thisChunkSize
                                   freeWhenDone:NO];
    offset += thisChunkSize;
    // do something with chunk
} while (offset < length);

然后,您可以将每个较小的块存储在某个位置,并在连接后对其执行您想要的操作。

在我这方面,这一切都未经测试,但似乎是合理的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7543712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档