如果我用Data
分配了一个bytesNoCopy:count:deallocator:.none
对象,它应该引用给定的字节,但是以一种不安全的方式,我作为程序员保证在数据的生命周期内这些字节将可用。比数据自己控制。
很好。我想知道的是...因为它是值类型而不是引用类型,所以当我从nocopy-Data中分配另一个Data变量时会发生什么?是否复制数据(违反我的明确意愿)?还是会创建另一个不安全的数据实例,我必须跟踪该实例的生命周期,否则可能会导致崩溃?
这是一个例子:
let unsafe = malloc(5);
func makeUnsafeData() -> Data
{
return Data(bytesNoCopy: unsafe, count: 5, deallocator: .none)
}
struct Foo
{
var d: Data
}
var foo = Foo(d: makeUnsafeData())
free(unsafe)
问题是:foo.d是否包含指向unsafe
中已释放字节的悬挂指针?还是它自己包含这些字节的副本,并且可以安全使用?
This experiment gist似乎表明NSData在上述情况下崩溃,正如预期的那样,但是Data并未崩溃;所以我的初步结论是,数据将复制数据,并且无法使用数据实例在函数之间传输字节而不复制字节。但是我很乐意引用任何反驳或证实这一理论的文档。
答案 0 :(得分:0)
结果是,答案毕竟是in the documentation……只要您所有的数据实例都是let
,而且您永远都不会对其进行变异,那么只有原始字节才应该在内存中,所有数据都只引用它。
我可能只是使用NSData,因为它是一种引用类型,并且魔术作用较小……