首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >制作UIImage的深层拷贝

制作UIImage的深层拷贝
EN

Stack Overflow用户
提问于 2010-10-23 09:41:18
回答 6查看 8.4K关注 0票数 14

我的类包含一个UIImage属性,我希望访问它的任何外部客户端都能强制执行该属性作为“复制”属性。但是,当我尝试在我的自定义setter中执行复制时,我得到关于UIImage不支持copyWithZone的运行时错误。那么,什么是确保遵循正确的所有权策略的好方法呢?

代码语言:javascript
复制
// 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];
    }
}
EN

回答 6

Stack Overflow用户

发布于 2012-04-08 13:58:24

以下是一种方法:

代码语言:javascript
复制
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变量变得疯狂。它显示奇怪的随机数据,即使它是在文件被删除之前初始化的。当我首先进行深度复制时,它工作得很好。

票数 15
EN

Stack Overflow用户

发布于 2016-02-07 06:02:55

一份深拷贝

当谈到深度复制时,我们必须首先理解UIImage是一个容器。它实际上并不包含图像数据。底层数据可以是CIImageCGImage。在大多数情况下,支持数据是一个CGImage,而后者又是一个包装结构,复制CGImage只是复制元数据,而不是底层数据。如果想要复制底层数据,可以将图像绘制到上下文中,或者以PNG格式获取数据的副本。

UIImagePNGRepresentation

使用以下代码创建一个游乐场演示了该方法。

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2010-10-23 11:02:55

为什么需要复制语义?UIImage是不可变的,因此设置复制策略没有任何好处。如果有其他人可能修改您的镜像的风险,您只需要一个复制策略。因为UIImage是不可变的,所以没有发生这种情况的风险,所以保留属性就可以了。

如果你多解释一下你正在尝试做什么,可能会有其他方法来实现它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4002040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档