我有两个类,它们都有要实现的协议。
我可以将一个类的协议实现到另一个类中,反之亦然吗?
这会导致任何运行时错误吗?
我有两个类,它们都有要实现的协议。
我可以将一个类的协议实现到另一个类中,反之亦然吗?
这会导致任何运行时错误吗?
你的问题是循环依赖。前向声明也无济于事,因为您只会让编译器警告您它看不到协议的定义。有两种选择:
将协议拆分为它们自己的头文件:
类A.h:
#import <Foundation/Foundation.h>
#import "ClassBProtocol.h"
@interface ClassA : NSObject <ClassBProtocol>
@end
B类.h:
#import <Foundation/Foundation.h>
#import "ClassAProtocol.h"
@interface ClassB : NSObject <ClassAProtocol>
@end
ClassAProtocol.h:
#import <Foundation/Foundation.h>
@protocol ClassAProtocol <NSObject>
...
@end
ClassBProtocol.h:
#import <Foundation/Foundation.h>
@protocol ClassBProtocol <NSObject>
...
@end
如果您不关心在外部声明您实现了协议,那么您可以使用类延续类别:
类A.h:
#import <Foundation/Foundation.h>
@interface ClassA : NSObject
@end
A.m 类:
#import "ClassA.h"
#import "ClassB.h"
@implementation ClassA () <ClassBProtocol>
@end
@implementation ClassA
@end
B类.h:
#import <Foundation/Foundation.h>
@interface ClassB : NSObject
@end
B类.m:
#import "ClassB.h"
#import "ClassA.h"
@implementation ClassB () <ClassAProtocol>
@end
@implementation ClassB
@end
但是,我不认为这真的有必要。一旦你实现了一个委托,那么你可以向另一个类发送一条消息,因为它是同一个委托对象。我想一个简单的委托关系为;
A级
@protocol ClassAProtocol;
@interface ClassA:NSObject
@property(nonatomic, assign) id<ClassAProtocol> delegate;
@end
@protocol ClassAProtocol <NSObject>
-(void)classA:(ClassA*)classa didSomething:(id)object;
@end
@implementation ClassA
-(void)classAFinishedSomething{
[self.delegate classA:self didSomething:nil];
[(ClassB*)self.delegate doSomething];
}
@end
B类
@interface ClassB : NSObject<ClassAProtocol>
-(void)doSomething;
@end
@implementation ClassB
-(void)doSomething{
}
-(void)classA:(ClassA*)classa didSomething:(id)object{
}
@end
我想这不会在两个对象之间创建循环引用并保持代码干净。如果委托始终是 B 类并且它响应到选择器,则此逻辑是有效的,它作为消息发送到 B 类。但是,如果您想隔离类之间的日志,则 matt 发布的上述示例是严格模式通过标准机制进行通信。