我的类包含一个UIImage属性,我希望访问它的任何外部客户端都能强制执行该属性作为“复制”属性。但是,当我尝试在我的自定义setter中执行复制时,我得到关于UIImage不支持copyWithZone的运行时错误。那么,什么是确保遵循正确的所有权策略的好方法呢?
// declared in the interface as:
@property (nonatomic, readonly, copy) UIImage *personImage;
// class implementation
- (void)setPersonImage:(UIImage *)newImage
{
if (newImage != personImage)
{
[personImage release];
// UIImage doesn't support copyWithZone
personImage = [newImage copy];
}
}发布于 2012-04-08 13:58:24
以下是一种方法:
UIImage *imageToCopy = <# Your image here #>;
UIGraphicsBeginImageContext(imageToCopy.size);
[imageToCopy drawInRect:CGRectMake(0, 0, imageToCopy.size.width, imageToCopy.size.height)];
UIImage *copiedImage = [UIGraphicsGetImageFromCurrentImageContext() retain];
UIGraphicsEndImageContext(); 我需要这样做的原因是,我用imageWithContentsOfFile:初始化了一个图像变量,并且我希望能够从磁盘中删除该文件,但保留该图像变量。我惊讶地发现,当文件被删除时,image变量变得疯狂。它显示奇怪的随机数据,即使它是在文件被删除之前初始化的。当我首先进行深度复制时,它工作得很好。
发布于 2016-02-07 06:02:55
一份深拷贝
当谈到深度复制时,我们必须首先理解UIImage是一个容器。它实际上并不包含图像数据。底层数据可以是CIImage或CGImage。在大多数情况下,支持数据是一个CGImage,而后者又是一个包装结构,复制CGImage只是复制元数据,而不是底层数据。如果想要复制底层数据,可以将图像绘制到上下文中,或者以PNG格式获取数据的副本。
UIImagePNGRepresentation
使用以下代码创建一个游乐场演示了该方法。
let zebra = UIImage(named: "an_image_of_a_zebra")
print(zebra?.CGImage) // check the address
let shallowZebra = UIImage(CGImage: zebra!.CGImage!)
print(shallowZebra.CGImage!) // same address
let zebraData = UIImagePNGRepresentation(zebra!)
let newZebra = UIImage(data: zebraData!)
print(newZebra?.CGImage) // new address发布于 2010-10-23 11:02:55
为什么需要复制语义?UIImage是不可变的,因此设置复制策略没有任何好处。如果有其他人可能修改您的镜像的风险,您只需要一个复制策略。因为UIImage是不可变的,所以没有发生这种情况的风险,所以保留属性就可以了。
如果你多解释一下你正在尝试做什么,可能会有其他方法来实现它。
https://stackoverflow.com/questions/4002040
复制相似问题