苹果是否声明了我不知道的方法[CIImage initWithImage:(CIImage*)]?据我所知,唯一具有该签名的方法是[CISampler initWithImage:]。但是当我试图提供我自己的方法时,编译器警告我该方法已经存在。
背景:我正在尝试创建一个方便的方法,将NSImage实例转换为CIImage。然后,我创建了一个接受NSImage实例的类别方法[CIImage initWithImage:]。
以下是category方法声明:
@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提前谢谢。
发布于 2010-07-18 14:58:53
根据猜测,您还没有将定义类别的头文件包含到.m文件中,
这里的诀窍是CIImage alloc返回一个'id‘类型的值。因此,他们不知道将搜索仅限于CIImage类,而是遍历所有类,这就是为什么他们在CISampler中找到定义的原因。
我认为如果你把代码改成这样:
ciImage = [ ((CImage*)[CIImage alloc]) initWithImage:newImage];您可以跳过警告,因为编译器将对使用哪个版本的initWithImage:有更多的线索。
在悲哀的情况下,做你所做的事情是不好的。将您的方法重命名为initWithNSImage:-从长远来看,它将更容易支持。
(苹果公司真的应该将他们的方法命名为initWithNSImage:但他们似乎通常保留了从他们的方法中删除"NS“的权利,因为这是他们的框架,他们赢了)。
https://stackoverflow.com/questions/3274358
复制相似问题