Date Category misc
  • "" category: 未分类
    tags: iPhone

这个学期选了我导师的Mobile Computing课程,课上给我们讲iPhone Programming。不过这边讲技术跟国内路子不一样,不会为讲技术而讲技术,都是让助教做tutorial,一共就三次动手实验,然后大量时间都得自学。我还在思考国内高校这种灌输式的教j2ee,教Windows编程是不是可取。

到现在已经做了两次动手实验了,第一次写了个hello world,第二次写了个计算器。也算是入门了。到了我这个岁数的人,对多掌握几个API,多使用几个控件已经没啥兴趣了。此外还肩负着把人类知识体系往前推进一点点的research重担,也没时间学习这个,反正以后也不可能成为iOS程序员。倒是对Objective C这个语言,还有苹果的这套开发平台比较感兴趣,想穷根究底的看看这个平台到底是咋回事。于是做了一番研究,再加上自己的感觉,自己对谷歌跟微软的开发平台还算了解,就顺便跟谷歌跟微软提供的平台的对比。报告如下,当然不一定对,还是一家之言,不展开,点到为止。

一直觉得学习iOS开发门槛还是有一些的,语言,框架,跟IDE都是肥猪流,毕竟以前国内的MAC开发者数量接近于0。所以就从三个方面说起吧。

Section 1: 语言

谷歌跟微软在移动平台上的开发语言战略倒是类似,一个是C#一个是“java”,都是基于虚拟机的托管代码,好处自然是把开发者的门槛降低了,不用管内存,阿猫阿狗也可以开发手机程序了。谷歌比较有意思。虽然号称用java,但是其实自己做了个虚拟机把java byte code又翻译成了另外的语言。还有一个好处是可以跨平台,x86版的android很多程序都可以直接跑,当然x86版的wp7还没出现。缺点么,自然是额外开销。说安卓“卡”是由于虚拟机,不是没有道理,但应该也不能全都怪罪虚拟机。

Objective C也是面向对象的C,但是跟C++走的是完全不同的路。C++尝试从各个层面去“兼容”C语言,因此发明了很多运算符重载啊等这种特性。当然也带来了不少额外的问题,不可否认的是对开发者要求高了,开发者要开发出高效的C++程序,不但要懂语法,还经常要知道C++编译器到底帮你干了些啥。比方说copy constructor,pass by value啊等等这些,新手不小心就会掉进陷阱,这些年在学校里看学生的作业,看到的太多例子了。

初次接触Objective C都会觉得语法怪异,有些代码是纯C风格,可以打xxx.xxx = 3,有些就要套方框,叫做消息传递。用了一段时间之后,突然觉得这么设计也不是坏事。用两套风格迥异的语法把面向对象跟面向过程分开,要套方框了,写代码的人就知道开始OO了,不套方框,你就还在写C呢。这点比C++好,写C++的时候,脑子里面时刻紧绷现在到底是不是在OO的人估计还是少数。前几年流行的新形态MVC,M用native code,V用XML,C用动态语言,也有这样的考虑,像MFC一样,MVC都用一种语言写,新手程序员分不清哪个是M,哪个是C,写写写就写混了。把MVC从语言层面“强拆”,也不失为一种方案。OC设计的时候,或许也有这样的考虑吧。

还有一个就是内存管理,OC还是需要ref counting的,打回到COM时代了,AddRef, Release。对习惯虚拟机开发的人来说,无疑门槛高了。但总比C++的delete直接干掉对象好吧。对于非专业,非完美人士而言,其实泄点内存没啥。不就是泄到一定时候,你的程序突然“消失”了么,再重启就是了。当然如果是个游戏,人家奋战很长时间,突然退出了,就要骂娘了。这个方案,算是托管代码(完全不用管)跟本机代码(手动管)的折衷吧。

OC还有一个骇人的特性是动态语言特性,方框框起来要发送的消息,居然可以在实现里面不存在,然后编译的时候不报错,运行的时候才挂!这,这不是脚本语言么?其实看看实现没啥,跟C++比,如果C++允许运行时改虚函数表,这个也能做得到么。所以OC跟这个叫发消息,不叫调函数。这个特性,又算是在托管代码(强大的meta data与reflection支持)跟本机代码(编译时确定,或vtable)之间的折衷吧。

还有比较诡异的是OC对空指针访问不报错。这个么,咋说呢,当然可以带来便利,从设计上来说也无可厚非,反正本来就是发消息不是掉函数,你发消息,没人处理,也没错。但是这个设计还是有隐患的。觉得有点类似我D的维稳政策了。把问题压下去。对于用户看来当然不错,一片和谐景象,看起来好像啥都没发生过。这个作风跟iOS中程序崩溃的时候突然“消失”一样,不告诉用户出错了。跟Linux的直白告诉你Segmentation Fault,还有Windows的含蓄的告诉你“We apologize for the inconvenient”形成鲜明对比。由此看来,封闭的系统都很热衷于维稳,无论是计算机系统还是社会系统。

看起来OC就是个折衷,看来中庸之道贯彻的不错。据说乔布斯学习了几年东方文化,不知道有没有关系…..

最后说说编译器,去年WWDC 11苹果光荣宣布把GCC换成了LLVM。GCC要上进了。n年前就觉得GCC for ARM好慢啊……

[[太晚了,准备睡觉了] 下面两节放水,看响应再决定是否写]

Section 2: Framework / Library

看起来挺另类,其实仔细看看跟Android那套啊,WP7那套啊,甚至是被人唾弃的MFC比,都大同小异。UI框架这东西,举一反三。

Section 3: IDE

一句话,对IDE的依赖偏高了。但是XCode已经不要钱了,也没啥好抱怨的了,用呗。不过有人反映XCode有向iCode进化的趋势。花哨功能越来越多,可能会沦为装13码农专用利器。