我正在研究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分配的行,它就可以工作。
我错过了什么?
谢谢!
答案 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;
}
答案 2 :(得分:0)
首先,你应该将maskImage设置为nil,以确保它不是垃圾:
self.maskImage=nil;
这可能搞砸你的线(如果不是现在,那么以后):
if(!imaskImage)
然后,要制作副本,只需在UIImage子类中实现NSCopying。这很容易做到。然后你可以输入:
maskImage = [image copy];
或者,您可以将图像转换为数据,存档,然后取消存档,然后转换回UIImage。这样可以为您提供图像的完整副本。它有点复杂,但它与用于制作对象图的深层副本的方法相同。