总结下最近领悟到的东西吧。
1. Objective-C是门类C语言,它面向对象,但一点儿也不严谨。单继承,有类似于Java里接口的东西去代替多继承,但是实现过程要多灵活就有多灵活。看教程的时候,说它可以动态加载卸载函数,暂时没有深刻体会。虽然说了那么一大堆,单归根结底,Objective-C它还是C,所有标准C支持的,它都支持,于是小幻可以用exit()退出程序。顺便说一句,无论是在iPad还是在iPhone的应用程序里,都没有退出程序这么个东西,要退出就只能按那个圆圆的上面画着小方块的按钮,所以有两点要知道:
a.写程序的时候不用去考虑怎么退出的问题,除非像我这样有特殊情况;
b.虽然不用在程序里主动去写退出的一些东西,但是退出时的内存释放还是要做的,有时候因为没有做这项工作,导致程序退了,但是内存还被占着,东西还在后台跑着,浪费资源很严重的说。一个是视图不加载的时候,要释放内存;一个是系统发出memory短缺时要做一些处理,这时候不显示的view都可以释放掉(如果是多视图的话),要加载的时候,重新加载就好;还有就是最重要的dealloc()这个函数里啊,视图里所有用过的非临时对象都要释放,那些临时定义的,用完立马要释放。尤其是for循环里用的,别想着在循环里一个一个的定义,等循环结束再一起释放,循环次数太多的话,很有可能循环还没结束呢,程序就崩了。
2. 苹果是MVC模式的忠实粉丝,所以iOS下的程序严格的遵守了这一模式。目前小幻还没有用到M,但是对于V(view)和C(controller)却是被迫有了深刻认识。之前虽然一进实验室就听师兄师姐讲MVC,还曾经参与做过一个小小的B/S系统,但是都没有让小幻这么清晰的了解过它。B/S里这些东东都是人为分开的,学过做过的人知道,它完全可以不遵循MVC,后台逻辑、前台显示是可以统统写在jsp里的,但是很混乱很混乱,也不好管理和维护。所以要人为分开它们,要人为的主动去把这些东西分开。过程挺痛苦的,不过熟悉了,习惯了,就会越来越条理清晰。而苹果呢,压根儿就不给你这个机会。它根本就把视图跟控制器给分开了,连编辑器都不是一个。所以经常是这样一个场景,小幻忙忙的在Xcode(看官把它想成Mac OS下的VS好了)里写好业务逻辑,定义好IBOutlet,IBAction(看见那个IB没,就是Interface Builder的缩写,一会儿告诉你那是干嘛的),保存。接着就打开nib文件,进Interface Builder(这个在
windows下就没对应了,就算是MFC,它的控件布局也是集成在VS里的,偏偏苹果就给我们分开了。简单理解成用户界面的编辑工具吧),编辑视图,然后建立连接,把对应的IBOutlet,IBAction属性跟相应的控件连起来,如果有一天你也能像我这么“幸运”做iOS开发的话,你会懂我为什么说连。这是把view跟controller联系起来的过程。分得清清楚楚,让你想把它们混在一块儿都不行。
3. 一个对象是有生命周期的。这大家都知道。而小幻会犯什么错误呢,添加了子视图(是不是该叫子视图呢?呃,小幻对于这个名称对应一下都概念不清,所以常常表达不清来着)。小幻的例子是,要弹出一个弹出列表,弹出来的这个叫做popover,里面要显示成一个列表的样子,小幻用了表视图,只有一列。这俩都是一个对象。之前遇到什么问题呢,列表弹出了,内容也如常显示,点击之后让列表消失,再打开的时候,刚刚设定的选项并没有生效。刚开始很奇怪,明明都已经赋值了,后台打印出来的结果也是已经获取选中那行的值了。结果困扰小幻近一周的问题就出在,小幻彻底忘记这个popover以及它里面的表视图,每次显示都是重新new一个对象,旧的已经销毁了。所以选过选项之后,选择的结果根本不会被存下来,每次都是重新初始化,选择当然也就不会生效了。这时候师姐跟小幻说,选中之后把值传给一个全局的变量,也许可以解决。小幻之前就没有全局意识,这个类里的变量值,从来没有想过要传给其他对象。终于,敲了一下午例子,最后终于在晚上搞定了。实现UITableView这个对象需要实现它的一系列系统提供的方法,有一个是用来处理当一行被选中时要做的操作的函数。就在这个函数里,计算出哪行被选中,更改赋值,最后最重要一步是要发一个notification,通知它上一级的对象接到这个通知之后去执行一些操作。这里我们需要执行的操作有:
a.先把popover dismiss掉,这个有函数,调用下就好了;
b.将tableView中选中的值赋给父对象里的成员变量,因为它的生命周期比popover长,所以用它来存储我们的选择。有人就问,那程序结束之后,根视图对应的对象也没有了,拿什么来存我们要存的一些数据呢?有N种办法,官方都有文档的,这里就不赘述了。总之这步要存储数据了;
c.以上工作都做完以后,我们可以把引用赋空了。以上三步都是写在popover的父对象里的。因为popover没有那么长的生命周期。在父对象里调用函数弹出列表时,还有一些初始化的工作,无非new一个新的popover,对其初始化,就不赘述了。
呃,这篇文拖的时间太久了,以至于刚开始做完这一块儿时的一些新鲜体验都因为拖太久忘记了。写总结是一件很重要的事,可以帮助我们回忆自己都做过什么,理清思路,下次才不会犯同样错误。
最后,整个过程中小幻犯的最低级的错误就是耐心不足。敲了整个下午的代码,终于最后要调试,中间漏写一个函数,补上继续。没有任何语法或者链接错误,但是就是点击按钮没有反应,小幻当时有点儿抓狂。最后冷静下来意识到自己点错按钮,一排按钮,理所当然点了第一个,其实动作是链在那一排的倒数第二个按钮上的。发现的时候,小幻勒死自己的心都有。所以之后快要抓狂的时候,小幻会跟自己说,深呼吸,冷静下先。
呼,第一块儿算是先告一段落了吧,下次写写布程序到真机的东东。