【问题标题】:Hidden [CIImage initWithImage:] method?隐藏 [CIImage initWithImage:] 方法?
【发布时间】:2012-05-08 12:02:48
【问题描述】:

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

提前致谢。

【问题讨论】:

    标签: cocoa core-image


    【解决方案1】:

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

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

    我想如果你把你的代码改成这样:

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

    您可能会忽略警告,因为编译器会更清楚地知道要使用哪个版本的 initWithImage:。

    很遗憾,做你所做的事情是不好的。将你的方法重命名为 initWithNSImage: - 从长远来看,它会更容易支持。

    (Apple 确实应该将他们的方法命名为 initWithNSImage:但他们似乎通常保留从他们的方法中删除“NS”的权利,并且由于它的框架,他们赢了)。

    【讨论】:

    • 如果提问者提出相同的选择器,Apple 为他们的方法命名并不重要,反之亦然——事实上,很可能有一个隐藏的 -[CIImage initWithImage:](或 @ 987654323@) 方法,这就是为什么最好使用应用程序独有的前缀或后缀来标记您添加到类别中的任何方法。
    • 我确实包含了我的类别的头文件,但仍然收到编译器警告。最终我放弃了,将我的方法命名为“initWithNSImage”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 2010-11-13
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    相关资源
    最近更新 更多