Objective C协议循环依赖?

时间:2012-10-09 10:22:39

标签: objective-c ios interface protocols

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

现在,在我的ViewController中,我使用它来声明一个id类型的属性,它允许我交换实现,而VC不知道任何相关的内容。

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

问题是我有循环依赖。

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

类型的对象

有更好的设计吗?


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

ProtocolA标题:

#import <Foundation/Foundation.h>

 /*!
 Abstract interface for any Provider 
 */

@protocol DataProviderDatasource <NSObject>

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

@end

ProtocolB标题

#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;

@end

1 个答案:

答案 0 :(得分:13)

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

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

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

然后编译器在看到协议名称并且循环依赖被破坏时不会barf(除非你的协议都来自另一个当然是愚蠢的)。

然后,只要有身体依赖,你就可以#import MONProtocolB。