1

我正在研究 UIImageView 的一个子类,我需要的一件事是当使用 initWithImage: 消息初始化对象时,会创建一个“副本”。

我一定是在混淆某些东西,因为我看不到这里有什么不工作..

- (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 分配的行,它就可以工作。

我错过了什么?

谢谢!

4

3 回答 3

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;
}
于 2009-06-13T09:31:11.960 回答
0

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

self.maskImage=nil;

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

if(!imaskImage)

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

maskImage = [image copy];

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

于 2009-05-19T22:53:49.347 回答
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 中设置保留属性(例如 @property (nonatomic, retain))
于 2009-05-19T21:26:19.883 回答