IOS消息机制-委托(ptotocol与delegate)
protocal : 协议,protocal是一种语法,提供统一的接口给遵守协议的类使用。
delegate : 委托,是Coaoa中常用的一种设计模式,把自己的类需要做的一些事情委托给另一个类去做,实际做事的类就是delegate。而要写出delegate这样的东西需要protocal的语法来协助完成。
要写一个委托的模式的步骤:
写一个protocal,指明你需要你的类的delegate去干的事(.h文件)
@protocol MVCDemoViewDelegate <NSObject> -(void)showModel; @end
你的类包含一个你的delegate类的弱引用(.h文件)
@interface MVCDemoView : UIView
@property(nonatomic , weak)id<MVCDemoViewDelegate> delegate;
@end
在你的类实现里面在特定的事件发生时让这个delegate去执行你想干的事(.m文件)
- (void)showTheModel
{
if ([_delegate respondsToSelector:@selector(showModel)]) {
[_delegate showModel];
}
}
在使用你的类时,创建你的类的一个对象,并指明对象的delegate是谁(使用类时)
MVCDemoView * view = [[MVCDemoView alloc] init];
view.delegate = xxx;
这个xxx就很重要了,xxx需要实现你的那个遵守你的MVCDemoViewDelegate协议并实现它的方法。
最后,在你的类showTheModel的时候就会找到它的delegate xxx, 然后,xxx就会执行它实现的MVCDemoViewDelegate协议的方法啦。
上面的完整例子请参阅另外一篇文章《IOS之MVC》中的小例子。
使用委托需要注意的几点:
1.协议中的方法默认为required,当你需要说明方法是必须实现的时候使用required,可选的方法时使用optional关键字。这两个关键字的修饰范围是遇到下一个关键字之前;
2.delegate必须为weak,否则A对象有B属性,而B属性的delegate是A时会造成循环引用,造成内存泄露;
3.为了使用delegate模式,消息的发送者必须知道消息的接受者是谁,并把你接受者赋给发送者的delegate属性,而反过来则不需要,接受者只是遵守那样的协议就可以了,松耦合;
4.Cocoa框架中有很多delegate,如UITableViewDelegate,UITexiFieldDelegate,UIAlertViewDelegate。
浙公网安备 33010602011771号