ios专题 - 斯坦福大学iOS开发公开课总结
转自:http://blog.devtang.com/blog/2012/02/05/mvc-in-ios-develop/
前言
iphone开发相关的教程中最有名的,当数斯坦福大学发布的”iphone开发公开课”了。此公开课在以前叫做《iphone开发教程》,今年由于平板电脑的流行,所以也加入了ipad开发相关的课程。在网易公开课上,有该教程的2010年录象,并且前面15集带中文字幕文件,非常适合初学者学习。
在这里顺便说一下,网易公开课上的28集其实并不需要全部看完。真正的课程只有前面12集。后面的课程都是请一些业界的名人讲他们成功的app以及学生的作品展示,可看可不看。所以大家不要被28集这么多吓到。
由于近一年来iOS5以及xcode4的发布,苹果对原有的开发环境xcode以及开发语言Objective-C都有改进,所以原有的教程中很多 内容不再适用了。例如新的xcode4将Interface Builder集成到xcode中,整个IDE布局和快捷键完全大变样,又比如苹果为Objective-c引用了ARC和Storyboard,这些都 使得app的编程方式大为不同。
值得高兴的是,斯坦福大学最近更新了该公开课的2011年秋季录象,免费下载地址是:http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=480479762,不过现在该公开课还没有翻译,只能看英文原版了。新的课程相比以前要短了许多,一共只有9课。我大概快速看了一遍,总结一些心得给大家。
iOS的MVC模式
MVC模式算是客户端类程序使用的设计模式的标配了。iOS对于Model, View和Controller之间的相互调用有它自己的规范和约定,在公开课的第一课中,就介绍了应该如何将MVC模式应用在iOS开发中。主要的内容就体现在如下这张图中(图片来自该公开课第一课的配套pdf的第37页):
我下面详细介绍一下这幅图的意思。
首先图中绿色的箭头表示直接引用。直接引用直观来说,就是说需要包含引用类的申明头文件和类的实例变量。可以看到,只有Controller中,有对Model和View的直接引用。其中对View的直接引用体现为IBOutlet。
然后我们看View是怎么向Controller通讯的。对于这个,iOS中有3种常见的模式:
- 设置View对应的Action Target。如设置UIButton的Touch up inside的Action Target。
- 设置View的delegate,如UIAlertViewDelegate, UIActionSheetDelegate等。
- 设置View的data source, 如UITableViewDataSource。 通过这3种模式,View达到了既能向Controller通讯,又不需要知道具体的Controller是谁是目的,这样就和Controller解耦了。
最后我们看Model。Model在图上有一个信号塔类似的图形,旁边写着Notification & KVO。这表明Model主要是通过Notification和KVO来和Controller通讯的。关于Notification,我写了一个模版代 码片段如下:(关于代码片段的管理,推荐大家看我写的另一篇文章:使用Github来管理xcode4中的代码片段
1 |
|
所以,对于初学者,要正确地使用MVC模式还是挺难的,回想我们以前做公司某产品iphone版的时候,就有一些Model层直接依赖了 Controller层,比如Model层更新数据失败了,直接调用Controller层显示出一个失败的提示界面。这样层次划分不清,造成我们做 ipad版的时候很痛苦。最后我们做了代码重构,把Model的相应改变都用Notification来完成,使得在做ipad版开发时轻松了很多。
Convention About synthesize
“Convention over configuration”(约定高于配置)成就了Ruby On Rails,而iOS也有很多编程的约定。这些约定单独看没有什么好处,约定的最大好处就是,如果大家都遵守它,那么代码风格会趋于一致,你会很方便地读 懂或修改别人的代码。
我们可以从第一课PPT的第50页看到如下的代码:
从图中可以看到,该课程推荐大家在使用synthesize关键字时,为property设置一个下划线前缀。我也看过一些iphone的开源项目,比如facebook开源的 three20 ,它是遵守了这样的约定的。
其它的约定还包括:
- 以new, copy, alloc开头的方法,都应当由调用者来release,而其它方法,都返回一个autorelease对象。
- 通常iphone顶部的bar应该用UINavigation控件,而底部的bar应该用UIToolbar控件。
- 所有的UI操作都应该在主线程(UI线程)进行。这个似乎不是约定,但是好多同学不知道,也写在这儿吧。
UIView
刚开始对界面之间的跳转很不理解,后来发现其实很简单,就是一层一层叠起来的View。从View A上点击一个按钮跳转到View B,其实就是把View B“盖”在View A上面而已。 而“盖”的方式有好多种,通常的方法有2种:
一. 用UINavigationController把View B push进来。
1 |
|
二. 用presentModalViewController方法把View B盖在上面。
1 |
|
除此之外,其实还有一种山寨方法,即把View A和View B都用addSubView加到AppDelegate类的self.window上。然后就可以调用 bringSubviewToFront 把 View B显示出来了,如下所示:
1 |
|
上面说的是界面之间的跳转。对于一个界面内,其控件的布局其实也是一个一个叠起来的,之所以说叠,是指如果2个控件如果有重叠部分,那么处于上面的那个控件会盖住下面的。
Nib File
Nib文件实际上内部格式是XML,而它本身并不编译成任何二进制代码。所以你如果用iFile之类的软件在iPhone上查看一些安装好的软件的 目录,可以看到很多的以nib结尾的文件,这些就是该软件的界面文件。虽然这些XML经过了一些压缩转换,但是我们还是可以看到一些信息,例如它使用了哪 些系统控件等。
Nib文件刚开始给我的感觉很神秘,后来发现它其实就是用于可视化的编辑View类用的。其中的 File’s Owner一栏,用于表示这个View对应的Controller类。通常情况下,Controller类会有一个名为view的变量,指向这个view 的实例,我们也可以建立多个IBOutlet变量,指向这个view上的控件,以便做一些界面上的控制。
在Interface Builder上还有一个好处,是可以方便的将View的事件与Controller的IBAction绑定。只需要按住Ctrl键,从控件往 File’s Owner一栏拖拽,即可看到可以绑定的方法列表。其实这些只是简化了我们的工作,如果完全抛开Interface Builder,我们一样可以完成这些工作。我所知道业界的一些iOS开发部门,为了多人协作更加方便,更是强制不允许使用Interface Builder,一切界面工作都在代码中完成。如果你用文本编辑器打开Nib文件看过,就能理解这样做是有道理的。因为如果2个同时编辑一个界面文件,那 么冲突的可能性是100%,而且,从svn结出的冲突信息上看,你根本无法修正它。下面的代码演示了如何不用Interface Builder来添加控件以及绑定UI事件。
1 |
|
总结
总体来讲,学习iOS开发还是比较容易的。我大概花了一个月时间学习iPhone开发,就可以边做边学了。
苹果的设计对于开发者来说是非常友好的,很多时候使用相应的控件就行了,都不用操心底层细节。不象Android开发,一会儿要考虑不同手机分辨率 不一样了,一会儿又要考虑有些不是触摸屏了,一会儿又发现某款手机的cpu内存太弱了跑不起来,需要优化程序。另外,Objective-C相对于C++ 语言来说,要简单优雅得多,而且更加强大,所以做iOS的开发者很省心。
要说到不爽的地方,就是iOS开发相关的中文资料实在是太少了。要学习它,基本上需要查看苹果的官方英文文档以及WWDC大会视频,还有去stackoverflow上问问题。这对于英文不太好的同学这可能是一个障碍。不过反过来,习惯之后,通过这个锻炼了自己的英文水平,倒也是一大收获。
ios专题 - 斯坦福大学iOS开发公开课总结的更多相关文章
- 斯坦福大学 iOS 开发公开课总结
斯坦福大学 iOS 开发公开课总结 前言 iPhone 开发相关的教程中最有名的,当数斯坦福大学发布的 "iPhone 开发公开课 " 了.此公开课在以前叫做<iPho ...
- 2011斯坦福大学iOS应用开发教程学习笔记(第一课)MVC.and.Introduction.to.Objective-C
blog.csdn.net/totogo2010/article/details/8205810 目录(?)[-] 第一课名称 MVC and Introduction to Objective-C ...
- 斯坦福大学IOS开发课程笔记(第七课第一部分)
转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/31462099 作者:小马 这节课的内容太多,分两部分介绍.本节课主要是介绍怎样开发 ...
- IOS学习之斯坦福大学IOS开发课程笔记(第六课)
转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/28398697 作者:小马 这节课主要讲述多个MVC是怎样协同工作的.到眼下为止.全 ...
- 斯坦福大学 iOS 7应用开发 ppt
上网的找了很久都不全,最后发现原来网易那个视频下面就有完整的PPT..
- 斯坦福大学公开课:iOS 7应用开发 笔记
2015-07-06 第一讲 课务.iOS概述 -------------------------------------------------- 开始学习斯坦福大学公开课:iOS 7应用开发留 ...
- 斯坦福公开课:Developing IOS 8 App with Swift(1-3)心得体会
最近开始学习Swift开发移动程序.跟随斯坦福大学的公开课进行自学. 这真是一个美好的时代,虽然不能在斯坦福求学,但是可以观看录制的授课录像.讲义,好似老师在给我们上课一样! 心得: 1.每节课信息量 ...
- 斯坦福大学Andrew Ng教授主讲的《机器学习》公开课观后感[转]
近日,在网易公开课视频网站上看完了<机器学习>课程视频,现做个学后感,也叫观后感吧. 学习时间 从2013年7月26日星期五开始,在网易公开课视频网站上,观看由斯坦福大学Andrew Ng ...
- 斯坦福大学公开课机器学习:advice for applying machine learning | diagnosing bias vs. variance(机器学习:诊断偏差和方差问题)
当我们运行一个学习算法时,如果这个算法的表现不理想,那么有两种原因导致:要么偏差比较大.要么方差比较大.换句话说,要么是欠拟合.要么是过拟合.那么这两种情况,哪个和偏差有关.哪个和方差有关,或者是不是 ...
随机推荐
- suse系统FTP问题
1.修改FTP端口问题 在 这个配置文件中vi /etc/vsftpd.conf 添加 Listen_port=34 vi /etc/services ftp 21/tcp # F ...
- python yeild使用
闲的蛋疼又想起之前看到的文章,想想还是拿来复习一遍写进博客里. 原文链接:https://www.ibm.com/developerworks/cn/opensource/os-cn-python-y ...
- WPP
WPP(Wavefront Parallel Processing) 上一行的第二个LCU处理完毕,即对当前行的第一个LCU的熵编码(CABAC)概率状态参数进行初始化,如图5所示.因此,只需要上一行 ...
- HW4.25
public class Solution { public static void main(String[] args) { double sum; for(int i = 10000; i &l ...
- 修复南尼U盘
通常拿到手的U盘,用数码之家的ChipGenius一般检测不出主控型号,所以需要用到U盘量产工具来测. 量产工具注意版本 一般靠后的版本才能识别使用, . 如果识别不了==> 自动换成手动,U盘 ...
- PHP环境配置综合篇
1.WNMP: http://www.wnmp.com.cn/ En: https://www.getwnmp.org/ 2.xampp:https://www.apachefriends.o ...
- MVC中一般为什么用IQueryable而不是用IList
IList(IList<T>)会立即在内存里创建持久数据,这就没有实现“延期执行(deferred execution)”,如果被加载的实体有关联实体(associations),此关联实 ...
- 指纹增强程序Hong_enhancement
本算法是基于Lin Hong et al 的论文“Fingerprint ImageEnhancement: Algorithm and Performance Evaluation”编写而成.其中一 ...
- [Machine Learning (Andrew NG courses)]II. Linear Regression with One Variable
- ADO.NET与Oracle(一):获取多行记录集
近期接触ADO.NET和Oracle.将我寻常遇到的一些问题和大家共享. 我认为要想入门ADO.NET操作Oracle,最主要的要求就是要会通过ADO.NET更新Oracle中的数据. 该文简单讲些利 ...