gpt4 book ai didi

iphone - 声明委托(delegate)协议(protocol)

转载 作者:可可西里 更新时间:2023-11-01 04:23:56 24 4
gpt4 key购买 nike

我想知道在同一个类中声明一个protocol 和在一个单独的文件中声明它有什么区别;示例:

#import <UIKit/UIKit.h>

@class MyClassA;

@protocol MyDelegate <NSObject>

@required
- (MyClassA*)myMythod;

@optional
- (void)anOtherMethod:(NSString*)ID;

@end

@interface MyClassB : UIViewController <UITableViewDataSource, UITableViewDelegate>

@property (nonatomic, assign) id <MyDelegate> delegate;
......

在这里,我在与 MyClassB 相同的文件中声明协议(protocol)委托(delegate),我可以在单独的源文件中声明它(协议(protocol)委托(delegate))。在与类相同的文件中和在单独的文件中声明它有什么区别?谢谢!

最佳答案

肯定有细微的差别。

如果您谈论的协议(protocol)是一个特定类使用的委托(delegate),例如,MySpecialViewControllerMySpecialViewControllerDelegate,那么您可能非常希望将这两个声明保留在同一个标​​头中。例如,如果另一个类要实现该协议(protocol),它可能会逻辑上依赖于 MySpecialViewController 类。因此,您没有引入任何额外的依赖项。

但是,还有另一个(至少)使用协议(protocol)的重要原因。您可能试图解耦两个类之间的双向依赖关系。当然,编译器不会让两个 header #import 互为一个。但是,即使您将一个类的 #import 移动到 .m 文件,让两个类都完全了解彼此的完整 API 通常也是设计不佳的标志.

一个稍微解耦这种关系的方法是让一个类仅通过另一个实现的协议(protocol)来了解另一个。也许 Parent 拥有并创建了 Child 类,因此必须 #import "Child.h"。但是,Child 还需要调用 Parent 上的 foo:bar: 方法。你可以创建一个 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.h 而不是 Parent.h 中保留 FooProtocol 的声明时,这才有效。同样,如果这个 FooProtocol 只被 Child 使用过,那么将它 保留在 Child.h 中是有意义的,但是如果此协议(protocol)被 Child 以外的类使用,则可能不会。

因此,总而言之,如果您想保留最大程度地分离类之间相互依赖性的能力,或者鼓励在您的设计中更好地分离,请将您的协议(protocol)放在单独的 header 中

关于iphone - 声明委托(delegate)协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11382057/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com