我不明白为什么我必须在 Objective-C 中执行以下操作。我有兴趣发现一般意义上的原因(即为什么语言/编译器强迫我这样做),并且可能会发现我提出的实现的替代方案:
我有一个协议:
// (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 类中,我需要 #import 实现 @protocol 的“MyViewController.h”,即使具体实现从未在 Observed 类中显式引用?如果我不这样做,我会得到编译错误:
no known instance method for selector 'lookAtThisData:'
这里的问题当然是我想让多个不同的视图控制器实现这个协议。那么为什么我要强制导入其中一个来编译呢?
是否有另一种方法可以构造此代码以获得所需的效果,而无需在要使用它的类中导入协议的具体实现?