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

时间:2009-09-01 07:41:27

标签: iphone objective-c

我在Objective-C中使用外部协议时遇到了麻烦。

除了添加其他协议之外还有其他解决方案吗?


示例:

Class1.h

#import "Class2.h"

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

@interface Class1 : NSObject
{
     Class2 *variable;

}     ...

Class2.h

#import "Class1.h"
@interface Class2: NSObject {
    id <Class1Delegate> delegate;
}
@property (nonatomic,assign) id <Class1Delegate> delegate;

错误:

错误:找不到'Class1Delegate'的协议声明

2 个答案:

答案 0 :(得分:2)

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

Class1.h #import Class2.h吗?

<强>更新

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

Class1.h导入Class2.h
Class2.h导入Class1.h

问题在于:

  1. 编译器开始使用Class1.h
  2. 它遇到了一行:`#import“Class2.h”
  3. 打开Class2.h并开始在那里工作
  4. 找到以下行:#import Class1.h
  5. 忽略该行(以避免无限循环)
  6. 它抛出一个错误,因为Class2.h需要Class1.h中尚未编译的东西
  7. 你如何解决它取决于你,但这种循环表明你的设计出了问题。快速修复可能如下:

    <强> Class1.h

    @protocol Class1Delegate <NSObject>
    @required
    -(NSArray*) someMethod;
    @end
    
    #import "Class2.h" // moved here to avoid a cyclic dependency
    
    @interface Class1 : NSObject
    ...
    

    您只需在声明协议后移动#import

答案 1 :(得分:1)

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

出于好奇,Class2.m实际上是否实现了所需的someMethod方法?

我们可以看到更多的错误输出吗?

P.S。你不应该保留代表。您的@property指令应为(nonatomic, assign)。请参阅Ownership of Delegates, Observers, and Targets