2009-05-19 63 views
1

我正在处理UIImageView的一个子类,我需要的一件事是当对象使用initWithImage初始化时:创建'copy'消息。UIImageView子类复制图像

我必须混淆的东西,因为我看不到有什么是不是在这里工作..

- (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

这不是来自这个问题你遇到什么问题不清楚。 “不工作”是什么意思? – 2009-05-19 20:21:23

+0

好的,很抱歉,我在调试问题时遇到了问题。 我有一个uiimage类别,用于更改蒙版图像中的像素值。这可以使用注释掉的maskImage行,但不使用maskImage = [UIImage imageWithCGImage:[image CGImage]]; 我很怀疑实际上导致这个问题的类别,因为我得到的崩溃与内存访问不良有关。 – 2009-05-19 20:35:24

回答

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,而不是像
    • 没有必要保留/释放图像
    • 需要定义IMG,maskImage在.H
    • maskImage在.H应保留在@property中设置的属性(例如 @property(nonatomic,retain))
0

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

self.maskImage=nil; 

这可能(后来如果不是现在,那)搞砸了您的线路:

if(!imaskImage) 

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

maskImage = [image copy]; 

或者,你可以将图像转换为数据,存档,然后取消存档,然后转换回UIImage。这给你一个完整的图像副本。它稍微复杂一点,但它与用于制作对象图的深度副本的方法相同。

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; 
}