当前位置: 首页 > 编程日记 > 正文

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 结语

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

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

相关文章:

Datawhale组队学习周报(第035周)

希望开设的开源内容 目前Datawhale的开源内容分为两种&#xff1a;第一种是已经囊括在我们的学习路线图内的Datawhale精品课&#xff0c;第二种是暂未囊括在我们的学习路线图内的Datawhale打磨课。我们根据您的投票来确定精品课程的排期&#xff0c;打磨课程一旦完成&#xff…

【Project Euler】530 GCD of Divisors 莫比乌斯反演

【题目】GCD of Divisors 【题意】给定f(n)Σd|n gcd(d,n/d)的前缀和F(n)&#xff0c;n10^15。 【算法】莫比乌斯反演 【题解】参考&#xff1a;任之洲数论函数.pdf 这个范围显然杜教筛也是做不了的&#xff0c;而且考虑直接化简f(n)也遇到了困难&#xff0c;所以考虑将前缀和的…

php mysql 星级评分_jQuery+PHP实现星级评分

本例实现的效果&#xff1a;过渡动画显示评分操作。及时更新平均得分和用户所评的分数。后台限制用户重复评分操作&#xff0c;并在前端及时显示。XHTMLHTML结构分为用于显示灰星星div#big_rate、亮星星div#big_rate_up、分数span#s及span#g和提示信息div#my_rate。CSS.rate{wi…

Xt800、DEFY自带号码归属地更新包,更新至2013.4【数据总数278360条】

总结了http://bbs.gfan.com/forum.php?modviewthread&tid5603346&extrapage%3D1&page1和http://bbs.mfunz.com/thread-706813-1-1.html&#xff0c;经测试在我的XT800上可用&#xff0c;可以把其他的第三方来电软件通通删掉了。 特点&#xff1a;能够显示运营商&a…

中国电子学会图形化四级编程题:程序优化

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100&#xff0c;小马老…

当代艺术遇上虚拟现实:幻境视界打造基业VR美术馆

VR展览也许并不少&#xff0c;但专业的艺术展却难得一见。幻境世界周志强希望能借助VR技术&#xff0c;实现“一地办展、全球同展、永不闭馆”&#xff0c;更好地传播当代艺术。 从米开朗琪罗到库尔贝&#xff0c;再到雷诺阿&#xff0c;大师们不断找到新的艺术语言来阐释人体…

python二叉搜索树建立_700. 二叉搜索树的搜索(Python)

题目难度&#xff1a;★☆☆☆☆类型&#xff1a;二叉树给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在&#xff0c;则返回 NULL。例如&#xff0c;给定二叉搜索树:4/ \2 7/ \1 3和值: 2你应该返回…

CF484E Sign on Fence

题意 给定一个长度为n的数列&#xff0c;有m次询问&#xff0c;询问形如l r k 要你在区间[l,r]内选一个长度为k的区间&#xff0c;求区间最小数的最大值 Sol 二分答案 怎么判定&#xff0c;每种数字开一棵线段树 某个位置上的数大于等于它为1 那么就是求区间最大的1的序列长度大…

【组队学习】【30期】吃瓜教程——西瓜书+南瓜书

吃瓜教程——西瓜书南瓜书 航路开辟者&#xff1a;谢文睿、秦州领航员&#xff1a;邱振波航海士&#xff1a;谢文睿、秦州 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/pumpkin-bookB 站视频&#xff1a;https://www.bilibili.com/video/BV1Mh411e7VU内…

如何破解压缩文件密码-省时省力的方法

压缩文件破解工具下载地址&#xff1a;http://www.cnblogs.com/spring_wang/archive/2013/06/14/3135163.html 应该很多人都碰到过RAR加密、解密的问题吧。简单给大家介绍下如何用工具来破解RAR密码&#xff01;我们所利用的工具&#xff0c;就是“ARPR”、相信有些人肯定知道。…

学完javase和mysql_Java基础学完接下来应该学什么呢?

谢谢邀请&#xff01;Java基础部分涵盖了类、对象、属性和方法四大概念&#xff0c;以及封装、继承、多态的理解及使用。Java基础部分是Java学习过程中相对来说比较难的部分&#xff0c;Java语言属于开头难&#xff0c;之后越学越简单的语言。基础部分要清晰Java面向对象的开发…

Linux文件分割与合并:splitcat(转载)

转自&#xff1a;http://os.51cto.com/art/201104/255359.htm Linux下文件分割可以通过split命令来实现&#xff0c;而用cat进行文件合并。而分割可以指定按行数分割和安大小分割两种模式。Linux下文件合并可以通过cat命令来实现&#xff0c;非常简单。 在Linux下用split进行文…

【组队学习】【30期】李宏毅机器学习(含深度学习)

李宏毅机器学习&#xff08;含深度学习&#xff09; 航路开辟者&#xff1a;王茂霖、陈安东&#xff0c;刘峥嵘&#xff0c;李玲领航员&#xff1a;初晓宇航海士&#xff1a;王茂霖 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/leeml-notes开源内容&am…

mac下用Dosbox搭建dos下的汇编环境

安装Dosbox&#xff0c;下载地址 pan.baidu.com/s/1qZfgGc0 安装汇编编译器,下载masm pan.baidu.com/s/1c4k5fCc&#xff0c;在个人目录下新建 ~/Dosbox目录&#xff0c;把masm拷贝到Dosbox目录中 设置Dosbox autoexec, 编辑&#xff5e;/Library/Preferences/DOSBox\ 0.74\ …

java线程安全的set_Java并发编程之set集合的线程安全类你知道吗

Java并发编程之-set集合的线程安全类Java中set集合怎么保证线程安全&#xff0c;这种方式你知道吗&#xff1f;在Java中set集合是本篇是《凯哥(凯哥并发编程学习》系列之《并发集合系列》教程的第二篇&#xff1a;本文主要内容&#xff1a;Set集合子类底层分别是什么&#xff1…

亮剑.NET的系列文章之.NET实现三层架构(三)

最近一直在学习三层架构&#xff0c;前些天同样也写了一篇同样的博客&#xff0c;今天主要是通过一个登录的实例给大家讲解每部分的作用和相应代码的实现。先将实现三层架构的UML图给大家&#xff0c;帮助大家更好的理解三层。&#xff11;. UI作用 (1) 向用户展示特定业务数据…

【组队学习】【30期】6. 树模型与集成学习

树模型与集成学习 航路开辟者&#xff1a;耿远昊领航员&#xff1a;姜萌航海士&#xff1a;耿远昊 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/machine-learning-toy-code内容属性&#xff1a;打磨课程内容说明&#xff1a;本课程将对机器学习中的集成…

mysql整理碎片和显示语句错误

2019独角兽企业重金招聘Python工程师标准>>> &#xff11;、myisam存储引擎清理碎片方法 OPTIMIZE TABLE table_name &#xff12;、innodb存储引擎清理碎片方法 ALTER TABLE tablename ENGINEInnoDB &#xff13;、查看表碎片的方法 select ROW_FORMAT,TABLE_ROWS…

java 查询 代码_java使用es查询的示例代码

众所周知&#xff0c;elasticsearch简称es,它是基于基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是当前流行的企业级搜索…

【转】解密“设计模式”

有些人问我&#xff0c;你说学习操作系统的最好办法是学习程序设计。那我们是不是应该学习一些“设计模式”&#xff08;design patterns&#xff09;。这是一个我很早就有定论&#xff0c;而且经过实践检验的问题&#xff0c;所以想在这里做一个总结。 总的来说&#xff0c;如…

Qt Installer Framework实战

Qt Installer Framework是Qt发布的安装程序支持框架&#xff0c;只需要简单的配置就可以生成安装文件&#xff0c;同时可以通过javascript脚本来定制安装过程。 目录结构 config packages data meta 配置文件 config/config.xml packages/[product]/meta/package.xml packages/…

【NCEPU】徐韬:街景字符编码识别比赛

徐韬是华北电力大学数理系大四的学生&#xff0c;Datawhale成员/Dreamtech成员&#xff0c;参加了多期Datawhale的组队学习&#xff0c;也在天池/CCF/讯飞等比赛中取得了不错的成绩&#xff0c;现保送大连理工大学深造。 这篇图文是他在线下组队学习时&#xff0c;为大家分享自…

java 程序启动界面_程序启动界面java代码

最近写了个程序启动界面&#xff0c;分享一下import javax.swing.*;import java.awt.*;import java.net.*;//Download by http://www.codefans.net//程序启动界面/*dkplus专业搜集和编写实用电脑软件教程&#xff0c;*搜集各种软件资源和计算机周边&#xff0c;独立制作视频和p…

中国电子学会图形化四级编程题:食堂取餐

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100&#xff0c;小马老…

获取app传入的json值处理

$getDatas $_POST; if(empty($getDatas)) $getDatas file_get_contents("php://input"); $getDatas json_decode($getDatas,true); 转载于:https://www.cnblogs.com/wjw-/p/8496855.html

java虚拟机栈帧_Java虚拟机,运行时栈帧结构

业余生活要有意义&#xff0c;不要越轨。——华盛顿引导语“虚拟机”是一个相对于“物理机”的概念&#xff0c;这两种机器都有代码执行能力&#xff0c;其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的&#xff0c;而虚拟机的执行引擎则是由软件…

深入浅出Pytorch:01 课程大纲与PyTorch简介

深入浅出Pytorch 01 课程大纲与PyTorch简介 内容属性&#xff1a;深度学习&#xff08;实践&#xff09;专题航路开辟者&#xff1a;李嘉骐、牛志康、刘洋、陈安东领航员&#xff1a;叶志雄航海士&#xff1a;李嘉骐、牛志康、刘洋、陈安东开源内容&#xff1a;https://githu…

用C写有面向对象特点的程序

比如在一个项目中&#xff0c;有大量的数据结构&#xff0c;他们都是双向链表&#xff0c;但又想共用一套对链表的操作算法&#xff0c;这怎么做到呢&#xff0c;C中又没有C中的继承&#xff0c;不然我可以继承一父&#xff08;类中只有两个指针&#xff0c;一个向前一个向后&a…

[置顶] 单键模式的C++描述

设计模式-单键(Signelton)&#xff1a;其实单键的设计模式说来很简单&#xff0c;说的直白一点就是程序运行过程中保证只有一个实例在运行而已。在软件系统中&#xff0c;经常有这样一些特殊的类&#xff0c;必须保证它们在系统中只存在一个实例&#xff0c;才能确保它们的逻辑…

下java7 64有什么用_Win 7 64位系统安装java 8,看完就明白了

在 Windows 7 的 64 位系统中安装 jdk 8工具/材料Windows 7 64 位系统JDK 8 64位版本方法/步骤1 下载JDK 8安装文件011.1 访问JDK下载地址http://www.oracle.com/technetwork/java/javase/downloads/index.html点击 JDK Download 按钮&#xff0c;进入JDK下载页。021.2 下载JDK…