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
提前致谢。
答案 0 :(得分:2)
猜测,您没有将定义类别的标题包含在.m文件中,
这里的技巧是[CIImage alloc]返回类型为'id'的值。因此,他们不知道将搜索限制在CIImage类中,而是查看所有类,这就是他们在CISampler中找到定义的原因。
我认为如果您将代码更改为:
ciImage = [ ((CImage*)[CIImage alloc]) initWithImage:newImage];
你可能会超过警告,因为编译器会更多地了解要使用哪个版本的initWithImage:
感到悲伤,这是你做你所做的糟糕表现。将您的方法重命名为initWithNSImage: - 从长远来看,它将更容易支持。
(Apple应该将他们的方法命名为initWithNSImage:但他们似乎一般都保留从他们的方法中移除“NS”的权利,并且因为它们的框架,他们赢了)。