1.问题
你有两个对象,一个需要在另一个状态变化时得到通知,另外,其中的一个对象希望在运行时让另一个对象负责确定行为变化。
2.解决方案
委托模式定义了一种解决方案,其中一个对象保存另一个对象的引用。被引用的对象实现了事先确定的借口,该接口用于将引用对象中发生的变化通知给被引用对象。该模式不仅可以将引用对象中的变化通知给引用对象,同时它也可以用于将责任委托给被引用对象,活在运行时代替引用对象进行决策。
比如: 给定 Foo 和 Bar 两个对象,Foo 可能现则讲责任委托给 Bar ,以确定在错误发生时如何处理。当错误发生时, Foo 对象告诉它的委托 Bar 错误发生了, Bar就有机会介入。
在Objective-C中实现委托模式包括
1.创建一个定义委托接口的协议
2.创建一个实现了协议的委托对象
3.并在委托对象内包括一个被委托对象的引用
代码显示了协议和委托对象实现的示例,本例中,MyClass是将责任委托给被委托对象的类。委托的协议称为MyClassDelegate
Objective-C
@protocol MyClassDelegate
- (void)requiredMethod;
@optional
- (void)somethingOptional;
@end
@interface MyClass
{
id<MyClassDelegate> delegate;
}
@property (assign) id<MyClassDelegate> delegate;
@end
可以看出,MyClass实例保存一个委托的应用,委托需要实现MyClassDelegate协议。
为此,需要将MyClass的委托对象事先设置成一个实现了委托协议的对象实例。一个很重要的警告就是在Objective-C中使用委托时,委托必须指定成分配属性,这样就不会被保存了。这样做可以在被委托对象可能创建委托对象的情况下防止循环引用。如果委托对象保存被委托对象,那么这样循环引用会导致任何一个对象都不会被释放。