在iOS
开发过程中遇到需要读取文件数据的场景,我们第一会想到以下两个接口:
1 | +[NSData dataWithContentsOfURL:] |
这两个接口会把data直接加载到App
的内存中,如果涉及到的文件数据比较大,那么可能会直接导致App
爆内存crash
。
对于这种情况,iOS
的Foundation
框架提供了mmap
的数据加载方式,并以下面两种接口给开发者提供了这种能力:
1 | +[NSData dataWithContentsOfFile:options:error:] |
其中option
中字段NSDataReadingOptions
的定义如下:
1 | typedef NS_OPTIONS(NSUInteger, NSDataReadingOptions) { |
我们使用NSDataReadingMappedIfSafe
这个option
后,iOS
就不会把整个文件的数据全部load
进的App
的内存了,而是将文件的数据mmap
到进程的地址空间中,这样就可以优化爆内存的问题。
下图是在使用NSDataReadingMappedIfSafe
前后加载1.7G的文件数据内存占用的差异,可见差异非常大
由此可知使用mmap的方式确实可以解决iOS上load大文件爆内存的问题,后面我们就深入理解一下mmap的原理。