首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否隐藏[CIImage initWithImage:]方法?

是否隐藏[CIImage initWithImage:]方法?
EN

Stack Overflow用户
提问于 2010-07-18 12:49:06
回答 1查看 810关注 0票数 0

苹果是否声明了我不知道的方法[CIImage initWithImage:(CIImage*)]?据我所知,唯一具有该签名的方法是[CISampler initWithImage:]。但是当我试图提供我自己的方法时,编译器警告我该方法已经存在。

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

以下是category方法声明:

代码语言:javascript
复制
@interface CIImage (QuartzCoreExtras) 
-(id) initWithImage:(NSImage*) img;
@end

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

代码语言:javascript
复制
-(void) setImage:(NSImage *)newImage {
    [super setImage:newImage];
    [ciImage release];
    ciImage = [[CIImage alloc] initWithImage:newImage];
}

但是当我编译上面的方法时,我得到了一个警告,说其他人已经定义了这个方法,并且它接受了一个不同的参数:

代码语言:javascript
复制
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:]的方法体

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

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-18 14:58:53

根据猜测,您还没有将定义类别的头文件包含到.m文件中,

这里的诀窍是CIImage alloc返回一个'id‘类型的值。因此,他们不知道将搜索仅限于CIImage类,而是遍历所有类,这就是为什么他们在CISampler中找到定义的原因。

我认为如果你把代码改成这样:

代码语言:javascript
复制
ciImage = [ ((CImage*)[CIImage alloc]) initWithImage:newImage];

您可以跳过警告,因为编译器将对使用哪个版本的initWithImage:有更多的线索。

在悲哀的情况下,做你所做的事情是不好的。将您的方法重命名为initWithNSImage:-从长远来看,它将更容易支持。

(苹果公司真的应该将他们的方法命名为initWithNSImage:但他们似乎通常保留了从他们的方法中删除"NS“的权利,因为这是他们的框架,他们赢了)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3274358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档