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 结语
以上是所有内容,希望对大家有所帮助。