Iphone 有没有办法使用其他头文件的协议定义?

Iphone 有没有办法使用其他头文件的协议定义?,iphone,objective-c,Iphone,Objective C,我在Objective-C中使用外来协议时遇到问题 除了添加附加协议,还有其他解决方案吗 例如: 类别1.h #import "Class2.h" @protocol Class1Delegate <NSObject> @required -(NSArray*) someMethod; @end @interface Class1 : NSObject { Class2 *variable; #导入“Class2.h” @协议类代理 @必需的 -(N

我在Objective-C中使用外来协议时遇到问题

除了添加附加协议,还有其他解决方案吗


例如:

类别1.h

#import "Class2.h"

@protocol Class1Delegate <NSObject>
    @required
    -(NSArray*) someMethod;
@end

@interface Class1 : NSObject
{
     Class2 *variable;
#导入“Class2.h”
@协议类代理
@必需的
-(NSArray*)某种方法;
@结束
@接口类别1:NSObject
{
第2类*变量;
}

类别2.h

#import "Class1.h"
@interface Class2: NSObject {
    id <Class1Delegate> delegate;
}
@property (nonatomic,assign) id <Class1Delegate> delegate;
#导入“Class1.h”
@接口类2:NSObject{
id代表;
}
@属性(非原子,赋值)id委托;

错误:


错误:找不到“ClassDelegate”的协议声明

它应该按照您描述的方式工作。你确定没有别的事情发生吗

Class1.h是否导入Class2.h

更新:

如果Class1.h还导入Class2.h,那么您有一个头依赖循环:

Class1.h导入Class2.h
类别2.h进口类别1.h

问题是:

  • 编译器开始处理Class1.h
  • 它运行到一行:`#import“Class2.h”
  • 它打开Class2.h并开始在那里工作
  • 它找到以下行:
    #import Class1.h
  • 它忽略该行(以避免无限循环)
  • 它抛出一个错误,因为Class2.h需要Class1.h中尚未编译的内容
  • 如何解决它实际上取决于您,但这种循环表明您的设计有问题。快速修复方法可能如下所示:

    Class1.h

    @protocol Class1Delegate <NSObject>
    @required
    -(NSArray*) someMethod;
    @end
    
    #import "Class2.h" // moved here to avoid a cyclic dependency
    
    @interface Class1 : NSObject
    ...
    
    @协议代理
    @必需的
    -(NSArray*)某种方法;
    @结束
    #导入“Class2.h”//移动到此处以避免循环依赖关系
    @接口类别1:NSObject
    ...
    

    声明协议后,只需移动
    #import
    行即可。

    这应该可以正常工作,因为此模式一直在使用(例如,在UIScrollView.h中定义的
    UIScrollViewDelegate
    ,但您可以
    #import
    并在视图控制器类声明中使用它)

    出于好奇,Class2.m是否真正实现了所需的
    someMethod
    方法

    我们能看到更多的错误输出吗


    另外,您不应保留该代表。您的
    @property
    指令应该是
    (非原子,赋值)
    。看。

    啊,那就是你的问题了。你有一个标题依赖循环!你需要把事情分开。如果两个类之间确实存在循环依赖关系,我建议您重构类设计以消除这种反模式。当两个类相互导入时,它们本质上是同一个类。维基百科在上有更多的细节,所以在@Shaggy Frog上有一个关于这个的帖子:这是一个很好的建议。如果正确设计类,则不会发生循环依赖关系。Class2不会实现该方法,因为它只将该方法发送给委托