隐藏[CIImage initWithImage:]方法?

时间:2010-07-18 04:49:06

标签: cocoa core-image

Apple宣布我不知道的方法[CIImage initWithImage:(CIImage*)]吗?我知道的唯一具有该签名的方法是[CISampler initWithImage:]。但是当我尝试提供自己的方法时,编译器警告我说该方法已经存在。

背景:我正在尝试创建一种将NSImage实例转换为CIImage的便捷方法。然后我创建了一个类别方法[CIImage initWithImage:],它接收NSImage个实例。

这是类别方法声明:

@interface CIImage (QuartzCoreExtras) 
-(id) initWithImage:(NSImage*) img;
@end

我试图在NSImageView子类中使用它来缓存图像的CoreImage版本:

-(void) setImage:(NSImage *)newImage {
    [super setImage:newImage];
    [ciImage release];
    ciImage = [[CIImage alloc] initWithImage:newImage];
}

但是当我编译上面的方法时,我收到一条警告,说其他人已经定义了该方法并且它采用了不同的参数:

warning: incompatible Objective-C types 'struct NSImage *', expected 'struct CIImage *' when passing argument 1 of 'initWithImage:' from distinct Objective-C type

从XCode中的“跳转到定义”选项,该方法的唯一其他实现(除了我自己的实现)是[CISampler initWithImage:(CIImage*]。我对这个问题感到很困惑 - 我有什么不对的吗?

为了完整起见,这里是[CIImage initWithImage:]的方法体:

@implementation CIImage (QuartzCoreExtras) 
-(id) initWithImage:(NSImage*) img {
    NSData* tiffData = [img TIFFRepresentation];
    NSBitmapImageRep* bitmap = [NSBitmapImageRep imageRepWithData:tiffData];
    return [self initWithBitmapImageRep:bitmap];    
}
@end

提前致谢。

1 个答案:

答案 0 :(得分:2)

猜测,您没有将定义类别的标题包含在.m文件中,

这里的技巧是[CIImage alloc]返回类型为'id'的值。因此,他们不知道将搜索限制在CIImage类中,而是查看所有类,这就是他们在CISampler中找到定义的原因。

我认为如果您将代码更改为:

ciImage = [ ((CImage*)[CIImage alloc]) initWithImage:newImage];

你可能会超过警告,因为编译器会更多地了解要使用哪个版本的initWithImage:

感到悲伤,这是你做你所做的糟糕表现。将您的方法重命名为initWithNSImage: - 从长远来看,它将更容易支持。

(Apple应该将他们的方法命名为initWithNSImage:但他们似乎一般都保留从他们的方法中移除“NS”的权利,并且因为它们的框架,他们赢了)。