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。

posted on 2014-04-02 21:25  好好学习_天天向上  阅读(354)  评论(0)    收藏  举报