我知道这里有很多类似的问题,但我仍然需要对这个概念作一些澄清。
首先让我先说我确实了解协议是什么以及如何使用它们,我理解的问题是委托。我确实知道委托就是当一个程序中的一个对象代表另一个对象时,听起来很简单但很难看到整个画面。
1-委托是一种让编译器知道在哪里查找将操纵对象的代码(UITableView等)的方法吗?
2-委托和协议是否一起工作?
3-如果没有协议,委托是否存在?如果是的话,你能告诉我一个例子。
4-当我们声明一个协议并且一个类符合它时,我们可以说这个符合协议的类是委托协议的行为吗?
上述情况有多少?
非常感谢
答案 0 :(得分:3)
1-委托是一种让编译器知道在哪里查找将操纵对象的代码(UITableView等)的方法吗?
不,委托是一种设计模式。这只是一个概念。
2-委托和协议是否一起工作?
是的,它们可以很好地协同工作,这可能是为您的代表使用协议的最佳做法。
3-如果没有协议,委托是否存在?如果是的话,你能告诉我一个例子。
是的,你可以。委托概念只是为了删除对象的智力并将其放入委托中。例如,UITableView
不知道它有多少行,或单击一个单元格时要做什么,所以它要求它的委托。
但代表仍是另一个对象。
如果它实现了一个特定的协议,那就更好了,但你可以不用。
例如:
我的MyView是MyCustomViewController
的子视图。
<强> MyCustomViewController.h 强>
- (void)myViewIsTouched;
<强> MyView.h 强>
@property (nonatomic, weak) MyCustomViewController *delegate
<强> MyView.m 强>
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.delegate myViewIsTouched];
}
此示例中没有协议,但它仍然是委托。
(更好的方法是使用协议而不是在.h
)
4-当我们声明一个协议并且一个类符合它时,我们可以说这个符合协议的类是委托协议的行为吗?
我不确定说什么。但协议和委托不是一回事。实现协议的对象并不意味着它是委托。
答案 1 :(得分:1)
委派允许对象能够根据应用程序其他部分的更改来更改其外观/状态。设置一个
对象上的delegate
属性将允许编译器执行某些操作
在构建时检查。
通常使用协议来实现委托,因为它允许使用协议 委托对象为任何类而不是类的子类 有特定的行为。
是的,但这会导致您的课程紧密耦合,因为Foo
需要了解Bar
,反之亦然。使用协议允许您使用任何类,因此id
属性,从而导致系统松散耦合。
示例:
@class Foo;
@interface Bar : NSObject
- (void)respondToSomeAction:(Foo *)obj;
@end
@implementation Bar
- (void)respondToSomeAction:(Foo *)obj {
NSLog("responding to %@",obj);
}
@end
@interface Foo : NSObject
@property (nonatomic, weak) Bar *delegate
@end
@implementation Foo
- (void)someActionTriggered {
[self.delegate respondToSomeAction:self]
}
@end