Ios 为什么CGImage的copy()方法会在同一内存地址上生成一个映像?

Ios 为什么CGImage的copy()方法会在同一内存地址上生成一个映像?,ios,swift,pointers,Ios,Swift,Pointers,我目前正在努力解决CGImage的copy方法(或者CGImage的总体工作原理?) 背景:我操作了一个带有unsafemeutablepointer的图像,得到了一个EXC\u BAD\u访问错误。我发现这是由UIImage中已经显示的CGImage造成的(封装在UIImage中)。因此,我创建了一个CGImage的副本,它可以正常工作。由此我得出结论,copy必须创建图像的真实副本 但是:在用下面的代码检查指针时,我注意到两个指针指向的地址是相同的 这怎么可能 import UIKit v

我目前正在努力解决
CGImage
copy
方法(或者
CGImage
的总体工作原理?)

背景:我操作了一个带有
unsafemeutablepointer
的图像,得到了一个EXC\u BAD\u访问错误。我发现这是由
UIImage
中已经显示的
CGImage
造成的(封装在
UIImage
中)。因此,我创建了一个
CGImage
的副本,它可以正常工作。由此我得出结论,
copy
必须创建图像的真实副本

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

这怎么可能

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
,数据提供者仍然是相同的对象(和指针)

还要注意,对于不可变对象,
copy
函数不必返回新对象。它可以只返回上一个对象(例如,
NSArray


在random
CGImage
的提供程序中修改
数据
可能不是一件好事,因为您不知道数据的内部结构(是JPEG数据源吗?是PNG数据源吗?是位图吗?

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

还要注意,对于不可变对象,
copy
函数不必返回新对象。它可以只返回上一个对象(例如,
NSArray


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

好的,这很有意义。但我不明白,如果我操作UIView中显示的图像的图像数据,为什么会出现错误,但如果我操作副本,为什么不会出现此错误?@JPS不清楚您试图如何修改数据。但是,
UIImageView
可能会以某种方式检测到其
CGImage
引用中的更改,并且在创建副本时可能会被破坏。稍后在重新绘制过程中可能会出现相同的崩溃。使用一些新的见解更新了问题。关于图像数据的操作:这是没有风险的,因为CGImage数据是位图,而不是原始格式。当你给我指出正确的方向时,我接受它作为回答:-)好的,这是有道理的。但我不明白,如果我操作UIView中显示的图像的图像数据,为什么会出现错误,但如果我操作副本,为什么不会出现此错误?@JPS不清楚您试图如何修改数据。但是,
UIImageView
可能会以某种方式检测到其
CGImage
引用中的更改,并且在创建副本时可能会被破坏。稍后在重新绘制过程中可能会出现相同的崩溃。使用一些新的见解更新了问题。关于图像数据的操作:这是没有风险的,因为CGImage数据是位图,而不是原始格式。当你给我指出正确的方向时,我接受这个答案:-)
var uiImageIn = UIImage(named: "image.png")!

var image1 = uiImageIn.cgImage!

var data1 = image1.dataProvider!.data
var data2 = image1.dataProvider!.data

var ptr1 = UnsafeMutablePointer<UInt8>.init(mutating: CFDataGetBytePtr(data1)!)
var ptr2 = UnsafeMutablePointer<UInt8>.init(mutating: CFDataGetBytePtr(data2)!)

print("Image1Ptr: \(ptr1)")
print("Image2Ptr: \(ptr2)")