【问题标题】:How does = Operator Memory Allocate?= 运算符内存如何分配?
【发布时间】:2020-03-18 23:36:29
【问题描述】:

我有我的初始变量。

let videoImage:CIImage = CIImage(cvPixelBuffer: pixelBuffer)

我像这样创建另一个缓冲区。

let newImage:CIImage = self.videoImage

我打印出来看看他们的内存地址

print(videoImage)
print(newImage)

输出:

Optional(<CIImage: 0x280b91260 extent [0 0 1128 1504]>
  affine [1 0 0 -1 0 1504] extent=[0 0 1128 1504]
    colormatch "QuickTime 'nclc' Video (1,1,6)"_to_workingspace extent=[0 0 1128 1504]
      IOSurface 0x28073d990(675) seed:47 BGRA8 extent=[0 0 1128 1504]
)
<CIImage: 0x280b91260 extent [0 0 1128 1504]>

似乎它们具有相同的内存地址。 0x280b91260

有没有办法创建一个具有相同确切信息但内存地址不同的新变量?

例如

Optional(<CIImage: 0x280b91260 extent [0 0 1128 1504]>
  affine [1 0 0 -1 0 1504] extent=[0 0 1128 1504]
    colormatch "QuickTime 'nclc' Video (1,1,6)"_to_workingspace extent=[0 0 1128 1504]
      IOSurface 0x28073d990(675) seed:47 BGRA8 extent=[0 0 1128 1504]
)
<CIImage: 0x361a92348 extent [0 0 1128 1504]>

第一个和第二个是副本,但第一个有内存地址0x280b91260,第二个有0x361a92348

【问题讨论】:

    标签: swift memory


    【解决方案1】:

    CIImage 是一个。类是引用类型。类实例的赋值只是简单地赋值指针。换句话说,赋值只是给出了两个指向同一个对象的指针(你的0x280b91260)。这就是引用类型。见Is Swift Pass By Value or Pass By Reference

    如果你想要一份副本,请说self.videoImage.copy()

    【讨论】:

    • 啊。耐人寻味。这也是有道理的。
    • 那么videoImage.copy()= videoImage有什么区别呢?还是他们返回相同的东西?
    • 世界上的所有差异。该副本创建了第二个 CIImage object.
    • 啊,所以赋值运算符提供了另一个指向同一对象的指针,而.copy() 提供了一个具有全新内存地址的全新对象?极好的。我需要知道的。谢谢!
    • 这就是世界上所有的不同之处。我没有意识到。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2014-12-11
    • 2012-08-11
    • 2012-11-29
    • 2020-10-13
    • 2011-10-13
    • 2014-03-14
    • 2011-06-23
    相关资源
    最近更新 更多