我目前正在为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
答案 0 :(得分:2)
您的期望是错误的。 copy()
创建一个浅表副本。这意味着创建了一个新对象,但是所有内部结构仅通过引用进行复制。这意味着即使您收到新的CGImage
,数据提供者也将是相同的对象(和指针)。
还请注意,对于不可变对象,copy
函数不一定必须返回新对象。它可以只返回前一个对象(例如NSArray
会发生这种情况)。
在随机data
的提供者内部修改CGImage
可能不是一件好事,因为您不知道数据的内部结构(它是JPEG数据源吗?是PNG吗?数据源?是位图吗?)