Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa NSDocument和NSFileWrapper:减少内存占用的策略?_Cocoa_Nsdocument_Uidocument_Nsfilewrapper - Fatal编程技术网

Cocoa NSDocument和NSFileWrapper:减少内存占用的策略?

Cocoa NSDocument和NSFileWrapper:减少内存占用的策略?,cocoa,nsdocument,uidocument,nsfilewrapper,Cocoa,Nsdocument,Uidocument,Nsfilewrapper,基于,将文件包与NSDocument一起使用的推荐做法似乎是在自定义NSDocument实现中保留对根NSFileWrapper的引用 我的问题:这难道不意味着我的文档最终会占用两倍的内存吗 想象一下,一个简单的文档有一个NSString实例变量text。让我们假设文本可以相当大 在readFromFileWrapper:…中,我从文件包装数据中读取NSString,并将其存储在text中。然而,由于文件包装器是一个实例变量,它的原始NSData仍然存在,尽管我需要的只是NSString版本 有

基于,将文件包与
NSDocument
一起使用的推荐做法似乎是在自定义
NSDocument
实现中保留对根
NSFileWrapper
的引用

我的问题:这难道不意味着我的文档最终会占用两倍的内存吗

想象一下,一个简单的文档有一个
NSString
实例变量
text
。让我们假设文本可以相当大

readFromFileWrapper:…
中,我从文件包装数据中读取
NSString
,并将其存储在
text
中。然而,由于文件包装器是一个实例变量,它的原始
NSData
仍然存在,尽管我需要的只是
NSString
版本

有什么东西反对我一读完就丢弃
NSFileWrapper


编辑:这在考虑iOS和
UIDocument
时更有趣。我有一个可能包含数百幅图像的文档。

这是一个好问题,但我将直截了当地回答它

首先,不要过早地优化。如果您所拥有的只是相对较小的文件,那么还不必担心这个问题。你应该让你的应用程序正常工作

如果一旦你的应用程序运行起来,你发现你的文件往往非常大(比如数百兆字节),你可能会考虑对此进行优化

记住,今天的机器通常有8GB或更多的RAM。这需要大量的数据来填充。此外,使用虚拟内存时,NSFileWrapper将映射到数据文件中,这意味着它们将在内存中驻留至少一段时间,直到它们被读取为止,但之后它们可以以零成本被调出(它们不需要写回磁盘,因为它们已经在磁盘上)

被占用但无需磁盘访问即可释放的内存本质上是空闲内存

因此,再次强调,当你没有一个真正的测试用例,而这个测试用例实际上表现得很差时,不要试图进行优化,因为系统已经进行了难以置信的优化,如果你在没有测试能力的情况下对自己进行优化,那么你很可能会让事情变得更糟