Cocoa 未找到协议方法的避免方法

Cocoa 未找到协议方法的避免方法,cocoa,polymorphism,protocols,Cocoa,Polymorphism,Protocols,My AppDelegate包含对其主视图的ID类型的引用。该引用是多态的,因为它可能指向PDFView的子类或NSImageView的子类,具体取决于视图图像的来源。两个视图子类都实现相同的协议,因此我的AppDelegate不必知道它处理的是什么类型的视图。但是,每次调用其中一个协议方法时,我都会收到一条警告:“找不到实例方法'-methodName'(返回类型默认为'id')”。我可以忽略警告,也可以通过使用“performSelector:(@selector(methodName:)”

My AppDelegate包含对其主视图的ID类型的引用。该引用是多态的,因为它可能指向PDFView的子类或NSImageView的子类,具体取决于视图图像的来源。两个视图子类都实现相同的协议,因此我的AppDelegate不必知道它处理的是什么类型的视图。但是,每次调用其中一个协议方法时,我都会收到一条警告:“找不到实例方法'-methodName'(返回类型默认为'id')”。我可以忽略警告,也可以通过使用“performSelector:(@selector(methodName:)”调用协议方法来强制解决问题

我是否可以(或应该)做些什么来消除警告,而不必求助于performSelector

//FLAppDelegate.h
@interface FLAppDelegate : NSObject <NSApplicationDelegate>
{
    ...
    IBOutlet id _formImageView;  //type is FLPDFView* or FLImageView*
    …
}

//FLFormImageProtocol.h
@protocol FLFormImageProtocol <NSObject>
@required
- (void)        methodName;
@end

//FLPDFView.h
@interface FLPDFView : PDFView <FLFormImageProtocol>
@end

//FLImageView.h
@interface FLImageView : NSImageView <FLFormImageProtocol>
@end
//FLAppDelegate.h
@接口FLAppDelegate:NSObject
{
...
IBOutlet id _formImageView;//类型为FLPDFView*或FLImageView*
…
}
//FLFormImageProtocol.h
@协议FLFormImageProtocol
@必需的
-(无效)方法名称;
@结束
//FLPDFView.h
@接口FLPDFView:PDFView
@结束
//FLImageView.h
@界面FLImageView:NSImageView
@结束

使用协议键入实例变量:

IBOutlet id<FLFormImageProtocol> _formImageView;
iboutletid\u formImageView;

使用协议键入实例变量:

IBOutlet id<FLFormImageProtocol> _formImageView;
iboutletid\u formImageView;