3

我有两个类,它们都有要实现的协议。

我可以将一个类的协议实现到另一个类中,反之亦然吗?

这会导致任何运行时错误吗?

4

2 回答 2

3

你的问题是循环依赖。前向声明也无济于事,因为您只会让编译器警告您它看不到协议的定义。有两种选择:

选项1

将协议拆分为它们自己的头文件:

类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

选项 2

如果您不关心在外部声明您实现了协议,那么您可以使用类延续类别:

类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
于 2012-12-04T22:24:56.280 回答
0

但是,我不认为这真的有必要。一旦你实现了一个委托,那么你可以向另一个类发送一条消息,因为它是同一个委托对象。我想一个简单的委托关系为;

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 发布的上述示例是严格模式通过标准机制进行通信。

于 2012-12-04T23:43:13.317 回答