深入理解iphone开发中的delegate

先举一个例子:

假如"我"的本职工作之一是“接电话”,但"我"发现太忙了或来电太杂了,于是我聘请一位"秘书"分担我“接电话”的工作,如果电话是老板打来的,就让“秘书”将电话转接给“我”。。。

那么,“我”就是A Object.  “秘书”就是"我"的“Delegate”。写成代码就是 --   [我 setDelegate:秘书];

delegate的概念出现与mvc(model-view-controller),protocol,单线继承密切相关

The main value of delegation is that it allows you to easily customize the behavior of several objects in one central object.

Cocoa 中处理事件的方式有几种,其中一种是你可以重载类中的对应的事件处理方法,比如MouseDown事件在NSResponse类中就被方法mouseDown:处理,所以所有继承自NSResponse的类都可以重载 mouseDown:方法来实现对MouseDown事件的处理。

另外一种处理方式就是使用Delegate,当一个对象接受到某个事件 或者通知的时候,会向它的Delegate对象查询它是否能够响应这个事件或者通知,如果可以这个对象就会给它的Delegate对象发送一个消息(执行一个方法调用)

协议 Protocol :

我说下我的理解。object-c 里没有多继承。那么又要避免做出一个对象什么都会(super class monster,huge ,super,waste)一个超能对象本身是否定了面向对象的概念和真谛了。为了让代码更简洁,条理更清楚,可以将部分职责分离。

协议本身没有具体的实现。只规定了一些可以被其它类实现的接口。

  1. @protocal UITextFieldDelegate   
    -(BOOL) textFieldShouldReturn:(UITextField *) textField ;   
    @end   
    

    delegate 总是被定义为 assign @property
  1. @interface UITextField   
    @property (assign) id<UITextFieldDelegate> delegate;   
    @end   
    

    这样我们就在UITextField内部声明一个委托(delegate),那么就需要委托的代理实现UITextFieldDelegate 中约定的行为
  1. // 首先, 在接口里边声明要使用谁的Delegate   
    @interface delegateSampleViewController : UIViewController   
        <UITextFieldDelegate> {}   
    @end   
        
    // 然后在实现文件中初始化的时候, 设置Delegate为self(自己)   
    @implementation delegateSampleViewController   
        
    // ....   
        UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 300, 400)];   
        textField.delegate = self;//设置当前的控制器为UITextField的代理,相当于注册(指定)代理人   
        [textField becomeFirstResponder];   
        [cell.contentView addSubview:textField];   
        [textField release];   
    // ....   
        
    }   
        
    // 实现UITextFieldDelegate中约定的行为   
    #pragma mark UITextFieldDelegate Method   
    // called when 'return' key pressed. return NO to ignore.   
    - (BOOL)textFieldShouldReturn:(UITextField *)textField {   
        
        [textField resignFirstResponder];   
        return YES;   
    }  
    



Delegate and Protocol


 

  1. 我们通过发送消息给对象出发特定动作;对象发送某些变化的时候通过回调函数(callback)通知我们。对象在特定事件发生的时候,就会调用对应的回调函数,触发业务逻辑。
  2. 回调函数通过所谓的代理(Delegation)来实现.

委托(delegate)-------益处:

¨         它更为简洁的把程序的逻辑处理从UIApplication中分离了出来。

¨         它避免了程序员直接从UIApplication派生子类,试想如果通过从UIApplication派生子类的方法来管理应用程序的生命周期和系统事件是多么痛苦的一件事情。


  “委托模式中一般有两个对象参与处理同一个请求,所谓的请求在iPhone中就是应用程序的生命周期和系统事件,接受请求的对象将请求委托给另一个对象来处理,同样在iPhone中对应的是UIApplication在接收到生命周期和系统事件后委托给UIApplicationDelegate来处理。


  iPhone不采用继承体系而采用委托模式来实现聚合的原因,其更深层次在于iPhone框架的多样化使得继承无法保证子类行为的一致性,而委托模式恰恰是为了弥补继承的这个缺点诞生的。


  每个项目都会有一个UIApplication对象来处理应用程序的生命周期和系统事件,main()函数通过UIApplicationMain()来初始化应用程序的UIApplication,如果想对应用程序的UIApplication进行操作,就只能通过[UIApplication sharedApplication]来获取到UIApplication的引用,这个方法会返回一个全局唯一UIApplication对象给读者。


  同样,读者可以通过如下代码获取应用程序的委托对象:UIApplicationDelegate* myDelegate = [[UIApplication sharedApplication] delegate];


协议 Protocol :

  object-c 里没有多继承。那么又要避免做出一个对象什么都会(super class monster,huge ,super,waste)一个超能对象 本身是否定了面向对象的概念和真谛了。为了让代码更简洁,条理更清楚,可以将部分职责分离。

  协议本身没有具体的实现。只规定了一些可以被其它类实现的接口。

  delegate 总是被定义为 assign @property

  1. @interface UITextField   
    @property (assign) id<UITextFieldDelegate> delegate;   
    @end 
    
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值