为什么CGImage的copy()方法会导致图像在相同的内存地址上?

时间:2018-12-26 12:26:10

标签: ios swift pointers

我目前正在为copy的{​​{1}}方法(或CGImage的总体工作方式?)而苦苦挣扎。

背景:我用CGImage处理了一个图像,并得到了EXC_BAD_ACCESS错误。我发现这是由于UnsafeMutablePointer中已经显示的CGImage(封装在UIView中)引起的。因此,我创建了UIImage的副本,它可以正常工作。据此我得出结论,CGImage必须创建图像的真实副本。

但是:在用下面的代码检查指针时,我注意到两个指针指向的地址是相同的。

怎么可能?

copy

我希望ptr1和ptr2在这里有所不同。

更新

好,找出我的错误: 根本不需要创建import UIKit var uiImageIn = UIImage(named: "image2.png")! var image1 = uiImageIn.cgImage! var image2 = image1.copy()! var ptr1 = UnsafeMutablePointer<UInt8>.init(mutating: CFDataGetBytePtr(image1.dataProvider!.data)!) var ptr2 = UnsafeMutablePointer<UInt8>.init(mutating: CFDataGetBytePtr(image2.dataProvider!.data)!) print("Image1Ptr: \(ptr1)") print("Image2Ptr: \(ptr2) --> Same result as for ptr1!?") 的副本,因为访问CGImage已经创建了位图数据的副本。但是:在上面的代码中,我没有将dataProvider分配给任何变量。因此,它立即被释放,并且地址在大多数时间都被重用(另外,由于我已经通过dataProvider通过指针之一访问数据,因此会导致错误)。

在下面的示例中,指针的地址不同:     导入UIKit

dataProvider

1 个答案:

答案 0 :(得分:2)

您的期望是错误的。 copy()创建一个浅表副本。这意味着创建了一个新对象,但是所有内部结构仅通过引用进行复制。这意味着即使您收到新的CGImage,数据提供者也将是相同的对象(和指针)。

还请注意,对于不可变对象,copy函数不一定必须返回新对象。它可以只返回前一个对象(例如NSArray会发生这种情况)。

在随机data的提供者内部修改CGImage可能不是一件好事,因为您不知道数据的内部结构(它是JPEG数据源吗?是PNG吗?数据源?是位图吗?)