Swift NSData/数据存储是否连续?

Swift NSData/数据存储是否连续?,swift,Swift,数据/NSData字节是否保证存储在连续内存中?查看文档(),我的印象是可以使用withUnsafeBytes()或withUnsafeMutableBytes()访问字节的连续表示。但是,在调用这些方法时,可能会将字节从非连续存储复制到连续块 我认为,通过那些使用不安全…方法的访问字节时,复制字节会有点低效,而且当使用init(bytesNoCopy:…)初始值设定项时,字节显然是连续存储的,所以我倾向于认为它们总是连续存储的,但还没有看到任何文件如此明确地说明 存在withUnsafeByt

数据/NSData字节是否保证存储在连续内存中?查看文档(),我的印象是可以使用
withUnsafeBytes()
withUnsafeMutableBytes()
访问字节的连续表示。但是,在调用这些方法时,可能会将字节从非连续存储复制到连续块


我认为,通过那些使用不安全…方法的
访问字节时,复制字节会有点低效,而且当使用
init(bytesNoCopy:…)
初始值设定项时,字节显然是连续存储的,所以我倾向于认为它们总是连续存储的,但还没有看到任何文件如此明确地说明

存在
withUnsafeBytes
是一种记录他们保留不连续存储字节的权利的方式,但可以根据需要提供这种方式


这可能是因为他们想象NSData将被移植到内存受限的环境中,他们不希望您使用依赖于系统的代码。

不,
数据不能保证存储在连续内存中。但是,如果将
与unsafebytes
与unsafemutablebytes
一起使用,则会将所有缓冲区复制到单个连续缓冲区


如果您不想产生这种开销,可以使用该属性访问各个缓冲区。

请参见:感谢您,Alexander,获取源代码链接。查看代码是一次很好的教育经历,我在
enumerateBytes()
注释中发现了一条语句,即存储不保证是连续的,然后@Rob确认了这一点。如果
withUnsafeBytes
生成连续副本,那么,为什么在闭包之外使用传递给其闭包的指针不安全呢?在我看来,如果调用后要回收任何副本,那么它应该是不连续的副本,因为在关闭完成后,可以释放和重用连续的缓冲区。它们只保证缓冲区的完整性,直到您从该闭包返回为止。为什么要释放与原始缓冲区相反的连续缓冲区?特别是因为如果函数已经被调用过一次,将来再次被调用的概率要高得多。首先,这是一个逻辑问题:您处理的是一个不安全的指针,而不是对象,因此ARC语义不适用。当你完成了它并且可以发布时,你会如何通知操作系统?我们绝对不想回到一个
malloc
/
免费的世界。第二,这是现实。这就是它的工作原理。它们明确警告您从API关闭返回后不要使用缓冲区。第三,它更节省内存。将事物保持在连续的块中是有代价的。如果一开始就觉得必须将其拆分,那么可能会出现这样的情况,即保持连续缓冲区是不切实际的。