iPhone App开发实战手册学习笔记(5)之IOS常用机制

1 前言

在IOS开发中,相信大家一定听说过委托,数据源,target,action等等,今天我们就来简单的学习一下这些内容。

2 详述

2.1 委托和数据源

大家是否曾经有不知道如何去执行一项任务的时候?或许是修理一台洗碗机或者补一双袜子。你可以学者自己做,或者找人帮你完成你不懂的地方,这就是委托。

委托(delegation)的设计模式,可以让你的程序实现系统类定义好的接口。其工作方式:把一个对象介绍给另一个可以回答任何问题的对象。通过分配一个delegate,你可以在代码定义相关的接口来相应请求或者状态的变化。

如果我们的对象想要成为一个委托对象,它需要按照一定的协议来实现。协议好比是一个合同,许多在合同中的方法都是可选的,但是其他的方法是必须实现的。

例如查看一个使用委托的类:UIPickerView控件--用来从滚动列表中选取值。

查看UIPickerView类的文档,我们会发现实例变量以如下形式定义:

@property(nonatomic,assign) id<UIPickerViewDataSource> dataSource; 

这一声明说明,支持UIPickerViewDelegate协议的任何类(由id声明)都可以使用UIPickerView的委托。

2.2 目标和操作

而数据源则是需要显示的数据,作为委托,一个名为dataSource的实例变量必须在UIPickerViewDataSource协议中实现。

@property(nonatomic,assign) id<UIPickerViewDelegate>   delegate;  

在处理Cocoa Touch中的控件时候,当点击按钮,拖动滑块调节音量,这些元素需要通知应用程序中的其他部分,它的状态改变了。

其通过的是 target-action设计模式。换句话说,为每个控件设置一个target对象,用来接受改变的通知。像委托一样,你可以选择任何的对象。

和委托不同的地方在于,动作可以使对象定义的任何方法,只需要符合下面两个签名之一:

-(IBAction)actionOne{

}

-(IBAction)actionTwo:(id)sender{

}

Interface Builder使用IBAction来确定代码中的动作。第二种形式包含一种参数,该参数是发起动作的对象。在处理动作的时候,sender可能会使用到。

2.2.1 手动添加目标对象及方法

在Cocoa Touch中的每一个控件都是UIController的子类,该类定义了一下的方法:

-(void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents

该方法有三个参数,第一个是目标对象,用来接受事件活动通知。第二个是动作参数,该参数定义的消息将会发送到目标对象。第三个是controlEvents,用与指定触发执行动作的事件类型。

例如:UIControlEventValueChanged和UIEventTouchUpInside。

2.3 深入了解视图的生命周期

文件中的方法用 IBAction,属性用 IBOutlet与IB(Interface Builder)关联,例如:

@property(nonatomic,retain)IBOutlet UIButton *myButton;

他们会与.xib文件相关联,她的前身是NIB文件,“NeXT Interface Builder”的缩写,因为现在新的xib文件是基于XML的,所以改为xib。

NIB的加载机制使用访问器来设置这些实例方法变量,会使用内容存的对象来调用-setMyButton:方法。

被加载的对象拥有你在IB中做的所有设置。如果你改变了视图的背景颜色,这一变化将会记录在内存中,兵器你的实例变量会去访问它。

一个对象从NIB文件读取后,会发送一条-awakeFromNib消息,但是不能用于初始化信息在这个方法里面,因为此时视图还没有加载,UIVIew采用的是延迟加载技术,我们可以覆盖-viewDidLoad方法。

Cocoa Touch不仅会延迟加载,还可以在内存不足的时候将其自动移除。框架知道哪些是当前显示的视图,并会安全回收哪些不可见的视图。做这个处理时,它会发送消息给视图控制器,让你知道呢那日不足了。

-(void)didReceiveMemoryWarning 方法。

如果我们的视图依赖于大缓存的信息或者其他易于重建的数据,那么didReceiveMemoryWarning方法使用来清除这些对象的很好方式。

可以重写-viewDidUnload方法,设置我们的实例变量,让他们为空。

-(void)viewDidUnload{

self.myButton = nil;

[super viewDidUnload];

}

这里有一个细节:-viewDidLoad和-viewDidUnload方法可以呗多次调用,从而避免了初始化只可执行一次的问题。

不一定要使用NIB文件绘制图层,可以覆盖-loadView方法,然后用-addSubView:方法将他们添加到主视图中去。

最后,由于NIB加载器会保留存储在内存中的接口对象,所以你还要做最后一件事:当试图控制器销毁时,需要释放这些视图。

-(void)dealloc{

[myButton release];

       [super dealloc];

}

3 结语

以上是所有内容,希望对大家有所帮助。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值