我在自己的头文件中有一个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
答案 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。