我不明白为什么我必须在Objective-C中执行以下操作。我有兴趣发现为什么在一般意义上(即为什么语言/编译器迫使我这样做),也许发现替代方案,我已经拿出:为什么我的ObjC实现类#import实现协议的_interface_?
我有一个协议:
// (file: MyObserver.h)
@class TheObserved;
@protocol MyObserver <NSObject>
- (void)itWasObserved:(TheObserved *)observedInstance;
@end
有“TheObserved”即(周期地)的接口,使用的协议:
// (file: TheObserved.h)
@protocol MyObserver;
@interface TheObserved : NSObject
@property id <MyObserver> myObserver;
- (void)lookAtThisData:(NSString *)someData withObserver:(id <MyObserver>)observer;
@end
这就是说,你可以看到,该协议有一个消息,其接受一个实例的接口,并且接口有一个方法需要一个实例实现协议。
在我的接口的实现:
// (file: TheObserved.m)
#import "TheObserved.h"
#import "MyViewController.h" // <-- note this import
@implementation TheObserved
@synthesize myObserver;
- (void)lookAtThisData:(NSString *)someData withObserver:(id <MyObserver>)observer {
self.myObserver = observer;
// some asynchronous looking at the data is done here.
}
- (void)asynchCallback:(NSData *) data {
// check if the data is as we expect, if so ..
[self.myObserver itWasObserver: self]
}
@end
MyViewController.h实现协议:
// (file: MyViewController.h)
#import <UIKit/UIKit.h>
#import "OWLMorphDataObserver.h"
@interface MyViewController : UITableViewController <MyObserver>
@end
,并在其执行:
// (file: MyViewController.m)
#import "TheObserved.h"
@interface MyViewController() {
@property TheObserved *observed;
@end
@implementation MyViewController
@synthesize observed;
- (void) aMethod:(NSString *)dataString {
[self.observed lookAtThisData:dataString withObserver:self]
}
@end
我的问题是:为什么,在我的Observed类中,我需要#导入实现了@protocol的“MyViewController.h”,甚至是尽管具体实现从未在Observed类中明确引用?如果我不这样做,我得到和编译错误:当然,我想有多个不同的视图控制器实现此协议的
no known instance method for selector 'lookAtThisData:'
这里的问题是,。那么为什么我不得不导入其中的一个来编译它?
有没有另一种方法可以构造此代码以获得所需的效果,而不需要在想要使用它的类中导入协议的具体实现?
你能命名包含每个代码段的文件吗?例如“我有一个协议”添加“在foo.h中定义”。 – danh
当然,我做到了。 – scot
错误消息与您发布的代码不匹配。 '-lookAtThisData:'和'-lookAtThisData:withObserver:'是两种不同的方法。否则,您发布的代码是正确的。 '-lookAtThisData:withObserver:'在TheObserved.h中声明,并且这是您需要导入以调用该方法的头。 – Darren