Objective C协议循环依赖?

Ear*_*rey 7 protocols interface objective-c ios

我在自己的头文件中有一个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
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

@结束

jus*_*tin 13

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

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

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

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

然后你可以#import在任何有身体依赖的地方使用MONProtocolB.