UIImageView子类复制图像

时间:2009-05-19 19:54:05

标签: iphone cocoa-touch uikit uiimageview

我正在研究UIImageView的子类,我需要的一件事就是当对象初始化时使用initWithImage:消息创建了'copy'。

我一定很困惑,因为我看不到在这里工作的东西..

- (id)initWithImage:(UIImage *)image {
[image retain];
if (self = [super initWithImage:image]) {

    if (!maskImage) {
        maskImage = [UIImage imageWithCGImage:[image CGImage]];
        if (maskImage != nil) {
            NSLog(@"Made mask image");
        } else {
            NSLog(@"Failed");
        }
        //maskImage = [UIImage imageNamed:@"image.png"];
    }
}

[image release];
return self;
}

构建此错误时没有错误,并且似乎创建了maskimage(我没有收到失败消息)。但是,如果我取消注释从png分配的行,它就可以工作。

我错过了什么?

谢谢!

3 个答案:

答案 0 :(得分:1)

您应该保留已创建的图片,例如:

- (id)initWithImage:(UIImage *)image {
    if (self = [super initWithImage:image]) {
        if (!maskImage) {
                maskImage = [[UIImage imageWithCGImage:[image CGImage]] retain];
                if (maskImage != nil) {                
                        NSLog(@"Made mask image");
                } else {
                        NSLog(@"Failed");
                }
        }
    }
    return self;
}

答案 1 :(得分:0)

试试这个。应该管用。

- (id)initWithImage:(NSString *)image {
if (self = [super initWithImage:image]) {

        if (!maskImage) {
                img = [UIImage imageNamed:image];
                maskImage = CGImageRetain(img.CGImage);
                if (maskImage != nil) {
                        NSLog(@"Made mask image");
                } else {
                        NSLog(@"Failed");
                }
        }
}

return self;
}
  1. 变化
    • 传递NSString而不是图像
    • 无需保留/释放图片
    • 需要在.h
    • 中定义img,maskImage
    • .h中的maskImage应该在@property中设置retain属性(例如 @property(nonatomic,retain))

答案 2 :(得分:0)

首先,你应该将maskImage设置为nil,以确保它不是垃圾:

self.maskImage=nil;

这可能搞砸你的线(如果不是现在,那么以后):

if(!imaskImage)

然后,要制作副本,只需在UIImage子类中实现NSCopying。这很容易做到。然后你可以输入:

maskImage = [image copy];

或者,您可以将图像转换为数据,存档,然后取消存档,然后转换回UIImage。这样可以为您提供图像的完整副本。它有点复杂,但它与用于制作对象图的深层副本的方法相同。

相关问题