8

我在自己的头文件中有一个协议A,用作接口。然后我有两个具体的类,它们是该协议的不同实现。

现在,在我的 ViewController 中,我使用它来声明 id 类型的属性,它允许我在 VC 对此一无所知的情况下交换实现。

我还有protocolB,用于将这两个实现对象的委托调用委托给VC。

问题是我有循环依赖。

在协议 A 中,我需要声明一个 id 类型的“委托”属性。在协议 B 中,委托方法正在向调用者发送引用,调用者是 id 类型的对象...

有更好的设计吗?


更新示例,也许对其他人有帮助。

协议头:

#import <Foundation/Foundation.h>

 /*!
 Abstract interface for any Provider 
 */

@protocol DataProviderDatasource <NSObject>

@required
@property (nonatomic) id <DataProviderDelegate> delegate; 
-(void)update;

@end

协议B头

#import <Foundation/Foundation.h>
#import "DataProviderDatasource.h"
/*!
 Protocol that each  Data Provider implements to make delegate calls to notify its     delegate about data management operations.
 */

@protocol DataProviderDelegate <NSObject>

-(void)dataProviderWillUpdate:(id<DataProviderDatasource>)dataProvider;
-(void)dataProviderdidUpdate:(id<DataProviderDatasource>)dataProvider;

@结尾

4

1 回答 1

14

像类一样,您可以转发声明协议:

@protocol MONProtocolB; // << forward declaration -- #import not required

@protocol MONProtocolA
- (void)setDensity:(NSValue<MONProtocolB>*)pValue;
                           ^^^^^^^^^^^^ << compiler recognizes this as an
                                           objc protocol
@end

那么当编译器看到协议名称和循环依赖被破坏时,它就不会出错(除非你的协议都来自另一个当然是愚蠢的)。

然后,您可以#import在任何有物理依赖的地方使用 MONProtocolB。

于 2012-10-09T10:28:14.570 回答