肯定有细微的差别。
如果您正在谈论的协议是一个特定类使用的委托,例如,MySpecialViewController
和MySpecialViewControllerDelegate
,那么您可能非常希望将这两者的声明保留在同一个标头中。例如,如果另一个类要实现该协议,它可能会在逻辑上依赖于MySpecialViewController
该类。因此,您不会引入任何其他依赖项。
但是,使用协议还有另一个重要原因(至少)。您可能正在尝试解耦两个类之间的双向依赖关系。当然,编译器不会让两个头文件#import
相互连接。但是,即使您将一个类#import
移到.m文件中,让两个类各自完全了解彼此的完整 API 通常是设计不佳的标志。
稍微解耦这种关系的一种方法是让一个类仅通过另一个类实现的协议来了解另一个类。也许Parent
拥有并创建Child
类,因此必须#import "Child.h"
。但是,Child
也需要foo:bar:
调用Parent
. 你可以做一个FooProtocol
:
@protocol FooProtocol
- (void) foo: (int) arg1 bar: (BOOL) arg2;
@end
然后在 Parent.h 中:
@interface Parent : SomeBaseClass<FooProtocol> {
}
允许Child
这样做:
@interface Child {
}
@property (assign) id<FooProtocol> fooHandler;
并使用它
[fooHandler foo: 1 bar: YES];
这使孩子没有直接依赖于Parent
类(或 Parent.h)。但是,这仅在您将声明保留FooProtocol
在 FooProtocol.h 中而不是在 Parent.h 中时才有效。同样,如果FooProtocol
它只被 使用过Child
,那么将它保存在 Child.h 中是有意义的,但如果这个协议被除Child
.
因此,总而言之,如果您想保留最大程度地分离类之间的相互依赖关系,或者鼓励在设计中更好地分离,请将您的协议保留在单独的标头中。