gpt4 book ai didi

cocoa - 隐藏[CIImage initWithImage :] method?

转载 作者:行者123 更新时间:2023-12-03 17:44:44 24 4
gpt4 key购买 nike

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

提前致谢。

最佳答案

据猜测,您尚未将定义类别的 header 包含到 .m 文件中,

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

我想如果你将代码更改为:

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

您可能会忽略警告,因为编译器将更多地了解要使用哪个版本的 initWithImage: 。

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

(苹果确实应该将他们的方法命名为 initWithNSImage:但他们似乎通常保留从其方法中删除“NS”的权利,并且由于这是他们的框架,所以他们获胜)。

关于cocoa - 隐藏[CIImage initWithImage :] method?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3274358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com