Iphone 目标C中的前向类和协议

Iphone 目标C中的前向类和协议,iphone,objective-c,ios,protocols,forward-declaration,Iphone,Objective C,Ios,Protocols,Forward Declaration,我有两个类,它们都有要实现的协议 我是否可以将类的一个协议实现为另一个协议,反之亦然 这会导致运行时错误吗?您的问题是循环依赖关系。前向声明也不会真正有帮助,因为编译器会警告您它无法查看协议的定义。有两种选择: 选择1 将协议拆分为各自的头文件: 类别A.h: #import <Foundation/Foundation.h> #import "ClassBProtocol.h" @interface ClassA : NSObject <ClassBProtocol>

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

我是否可以将类的一个协议实现为另一个协议,反之亦然


这会导致运行时错误吗?

您的问题是循环依赖关系。前向声明也不会真正有帮助,因为编译器会警告您它无法查看协议的定义。有两种选择:

选择1 将协议拆分为各自的头文件:

类别A.h:

#import <Foundation/Foundation.h>
#import "ClassBProtocol.h"

@interface ClassA : NSObject <ClassBProtocol>
@end
#import <Foundation/Foundation.h>

@interface ClassA : NSObject
@end
#导入
#导入“ClassBProtocol.h”
@接口ClassA:NSObject
@结束
B.h类:

#import <Foundation/Foundation.h>
#import "ClassAProtocol.h"

@interface ClassB : NSObject <ClassAProtocol>
@end
#import <Foundation/Foundation.h>

@interface ClassB : NSObject
@end
#导入
#导入“ClassAProtocol.h”
@接口ClassB:NSObject
@结束
ClassAProtocol.h:

#import <Foundation/Foundation.h>

@protocol ClassAProtocol <NSObject>
...
@end
#import <Foundation/Foundation.h>

@protocol ClassBProtocol <NSObject>
...
@end
#导入
@协议类协议
...
@结束
ClassBProtocol.h:

#import <Foundation/Foundation.h>

@protocol ClassAProtocol <NSObject>
...
@end
#import <Foundation/Foundation.h>

@protocol ClassBProtocol <NSObject>
...
@end
#导入
@协议类协议
...
@结束
选择2 如果您不关心在外部声明您实现了协议,那么您可以使用类延续类别:

类别A.h:

#import <Foundation/Foundation.h>
#import "ClassBProtocol.h"

@interface ClassA : NSObject <ClassBProtocol>
@end
#import <Foundation/Foundation.h>

@interface ClassA : NSObject
@end
#导入
@接口ClassA:NSObject
@结束
A.m类:

#import "ClassA.h"
#import "ClassB.h"

@implementation ClassA () <ClassBProtocol>
@end

@implementation ClassA
@end
#导入“ClassA.h”
#导入“ClassB.h”
@实现类A()
@结束
@实现类A
@结束
B.h类:

#import <Foundation/Foundation.h>
#import "ClassAProtocol.h"

@interface ClassB : NSObject <ClassAProtocol>
@end
#import <Foundation/Foundation.h>

@interface ClassB : NSObject
@end
#导入
@接口ClassB:NSObject
@结束
B.m类:

#import "ClassB.h"
#import "ClassA.h"

@implementation ClassB () <ClassAProtocol>
@end

@implementation ClassB
@end
#导入“ClassB.h”
#导入“ClassA.h”
@实现类B()
@结束
@实现类B
@结束

但是,我认为这不是必要的。一旦实现了一个委托,就可以向另一个类发送一条消息,因为它是同一个委托对象。我假设一个简单的委托关系为:

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
@协议类协议;
@接口ClassA:NSObject
@属性(非原子,赋值)id委托;
@结束
@协议类协议
-(void)classA:(classA*)classA didtomething:(id)object;
@结束
@实现类A
-(void)classAFinishedSomething{
[self.delegate classA:self-didtomething:nil];
[(ClassB*)自我委托剂量测定];
}
@结束
B类

@interface ClassB : NSObject<ClassAProtocol>
-(void)doSomething;
@end
@implementation ClassB
-(void)doSomething{

} 
-(void)classA:(ClassA*)classa didSomething:(id)object{

}
@end
@接口类B:NSObject
-(无效)剂量测定;
@结束
@实现类B
-(无效)剂量{
} 
-(void)classA:(classA*)classA didtomething:(id)object{
}
@结束

我想这不会在两个对象之间创建循环引用并保持代码干净。如果委托始终为B类,并且它响应选择器:,即作为消息发送给B类的选择器,则此逻辑有效。但是,如果您希望隔离类之间的日志并通过标准机制进行通信,matt发布的上述示例是mode rigid。您的意思是希望两个类共享完全相同的协议实现吗?不,不同的实现,但两个类都实现彼此的协议。看起来它没有运行时错误。但它仍然无法进入块:if([delegate respondsToSelector:@selector(…)]){}正如您指出的,我所做的似乎也没有问题。但是:([delegate respondsToSelector:@selector(…)])返回falseWell,您实现了该方法吗?如果是这样,它将返回true。如果不实现该方法,它将返回false。我认为原因是我没有实例化对象并设置委托。如果我在两个方面都这样做的话,它就不能为我的海豚服务,因为我不能在不使用第三个类的情况下同时实例化这两个方面。听起来你可能需要重新考虑你的对象图。也许再贴一个问题,概述你真正想要达到的目标?(附言:“喂我的海豚”让我咯咯地笑了起来:-P)。是的,这是正确的,我已经使用了这个流程。问题是当我想保持原样,定义一个对类B的委托并在类a中实现它时