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

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

1 前言

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

2 详述

2.1 委托和数据源

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

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

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

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

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

 

@property(nonatomic,assign) id dataSource; 

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

2.2 目标和操作

 

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

 

@property(nonatomic,assign) id   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 结语

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

 

转载于:https://www.cnblogs.com/dyllove98/archive/2013/06/06/3122915.html

更多相关:

  • 来源:公众号|计算机视觉工坊(系投稿)作者:仲夏夜之星「3D视觉工坊」技术交流群已经成立,目前大约有12000人,方向主要涉及3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、...

  • 点云PCL免费知识星球,点云论文速读。文章:Real-Time LIDAR-Based Urban Road and Sidewalk Detection for Autonomous Vehicles作者:Ern˝o Horváth  , Claudiu Pozna ,and Miklós Unger编译:点云PCL代码:http...

  • 文章:Semantic Histogram Based Graph Matching for Real-Time Multi-Robot Global Localization in Large Scale Environment作者:Xiyue Guo, Junjie Hu, Junfeng Chen, Fuqin Deng, T...

  • 点云PCL免费知识星球,点云论文速读。文章:Robust Place Recognition using an Imaging Lidar作者:Tixiao Shan, Brendan Englot, Fabio Duarte, Carlo Ratti, and Daniela Rus编译:点云PCL(ICRA 2021)开源代码:...

  • 文章:A Survey of Calibration Methods for Optical See-Through Head-Mounted Displays作者:Jens Grubert , Yuta Itoh, Kenneth Moser编译:点云PCL本文仅做学术分享,如有侵权,请联系删除。欢迎各位加入免费知识星球,获取PD...

  • 点云PCL免费知识星球,点云论文速读。文章:DSP-SLAM: Object Oriented SLAM with Deep Shape Priors作者:Jingwen Wang Martin Runz Lourdes Agapito编译:点云PCL代码:https://github.com/JingwenWang95/DSP-S...

  • RAM缓存 新RAM缓存算法(CLFUS) 新的RAM缓存使用的创意来自许多缓存替换策略和算法,包括LRU,LFU,CLOCK,GDFS及2Q,它被命名为时钟周期内最小频繁使用大小算法CLFUS(Clocked Least Frequently Used by Size)。它避开了任何专利算法,具有如下特性: 均衡最近性(Rec...

  • MP4 |视频:AVC,1280×720 30 fps |音频:AAC,48 KHz,2 Ch |时长:2h 12m 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:560M C4D是一个有抱负的运动图形艺术家和设计师的重要工具。借助C4D,您可以使用3D对象、动态效果和动画来增强运动图形、模型和可视化效果。本课...

  • 文章目录先说问题:再说解决尝试1:尝试2(该尝试建议先在自己环境搭配对应业务测试通过后再现场尝试): 感谢 学无止境996同学的陪伴和vigourtyy美丽女友的支持,直到这个解决问题的深夜 先说问题: ceph 12.2.1生产环境:3副本 tier + 3副本data 机房在拥有业务的情况下重启集群交换机,产生如下场景...

  • 这周主要学习了java中的类和对象的知识点,发现和C++中的类和对象极为相似,对于类和对象的概念理解起来也简单。同时在自学的过程中也把类的知识重新复习巩固了一下(如类的三大特征:继承,封装和多态,构造,成员对象的访问权限,构造,无参有参函数的调用等),同时也了解到一些新的概念,比如类对象创建和引用占据堆内存和栈内存,输出对象时默认调...

  • 委托揭秘 编译器和CLR在后台做了很多工作来隐藏委托本身的复杂性,如下一句委托声明: //编译器为我们产生了一个同名的类 public delegate void MyDelegate(int i); 看看IL: 可以看出它默认继承自System.MulticastDelegate[所有委托都继承此类,MulticastDele...