【问题标题】:UIImageView subclass duplicate the imageUIImageView 子类复制图像
【发布时间】:2009-05-19 19:54:04
【问题描述】:

我正在研究 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 分配的行,它会起作用。

我错过了什么?

谢谢!

【问题讨论】:

  • 从这个问题中不清楚您遇到了什么问题。 “不工作”是什么意思?
  • 好的,抱歉,我在调试问题时遇到了麻烦。我有一个 uiimage 类别,它会更改掩码图像中的像素值。这使用注释掉的 maskImage 行但不使用 maskImage = [UIImage imageWithCGImage:[image CGImage]];我怀疑实际上导致此问题的类别,因为我遇到的崩溃与错误的内存访问有关。

标签: iphone cocoa-touch uikit uiimageview


【解决方案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;
}

【讨论】:

    【解决方案2】:

    试试这个。应该管用。

    - (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(非原子,保留))

    【讨论】:

    • 只是一个挑剔的注释,但您可能需要考虑将 -(id) initWithImage: 方法命名为类似于 initWithImageNamed: 的内容:它的编写方式让我认为该方法将 UIImage 作为参数,而不是带有图像文件名称的 NSString。
    • 是的,从他的示例中即时复制/粘贴代码,但会有意义。
    【解决方案3】:

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

    self.maskImage=nil;
    

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

    if(!imaskImage)
    

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

    maskImage = [image copy];
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      • 2017-08-12
      • 2012-09-26
      相关资源
      最近更新 更多