现在离开学校一年了。在武汉当iOS程序员与学校所学的知识之间相对比的感受。
Objective-C确实比较兼顾底层逻辑。一开始找工作,面试官一般想看我的有没有什么demo。我当时时间比较紧,来不及准备。所以,也没有开发过自己的什么demo。当时,写毕业论文的时候,同样没有想到写个demo啥的。同时完成了毕业设计,也方便出来找工作。没有接触到大城市,确实遗憾。当我自己尝试写demo的时候,碰见过很大的问题。以至于我自己买了本书看Linux C++之后,才终于想明白这些问题。
当时想写一个简单的天气的app,把网络请求下来的数据,显示到界面上。我当时碰见一个是可以NSlog,却无法显示到UILabel中。其实当时我手里买的书上有这样相同的例子。只不过我也不知道去参考。我也买了其他书,讲到了KVO模式。还是,不知其所以然,联系不到实际。
后来,在一家公司当学徒,让我去模仿开发一个微博app。我当时也是碰到这个问题了。有经验的工程师,说发个通知让UI界面更新一下就行了。当时,还是不是太懂了其中的道理。
当时我去面试的时候,面试官还问过我,如何让一个控件居中。当时书上也写了使用Masonry。我觉得不是很重要,也就没有学习。
我当时在第一个月开发iOS app的时候,才知道人家的需求是这样的。我要该如何如何做。
学校中的老师有没有教过,这个问题呢?或者说,有没有教过,如何开发一个android天气app呢?是有的。可是,当时老师也说了,开辟一个线程去进行网络请求,不然界面会卡死的。当时我有没有学会呢?我也学会了。问题是Android上面开发貌似简单,实际上省略了本质上的原理。不是,太重视这些问题。
下面讲下技术问题,为什么iOS开发要多此一举?
Linux C++上面是这样写的。需要开辟一个线程,一定要阻塞中当前的线程。因为CPU是在串行执行代码,从代码第一行执行到最后一行。命令行软件都是这样的理解。多线程相当于其中一段代码,由其他的CPU同时执行。阻塞当前线程啥意思?当前的线程先停一下,等到另外一个线程执行完了,当前线程再继续执行。我一下这有道理呀。可是我iOS开发上不是这样的呀!当前的线程没有停呀。然后,我继续想,我类比一下。我还学过单片机开发,单片机上控制一个LED闪烁,要写一个死循环。程序的基本格式一定要,有个地方开始又个地方结束。这就是程序的串行执行,从开始执行到结尾。看街头的红绿灯,一直这样工作。如果按照代码编写应该是,绿黄红然后就停了。可以在程序中让其执行一千遍,一万遍,一亿遍,结果还是会停的。让这个小计算机永远不停,就是一个死循环。哦,对了,iOS开发有一个叫runloop的东西,那是那个死循环的升级版。在iOS app一启动的时候,CPU在一直循环下去为了让用户一直可以看到界面。不然的话,程序启动界面显示完毕,然后退出程序。iOS开发在进行网络请求的逻辑应该是这样的。程序启动显示界面,进入死循环界面在一直显示。另外一个线程去请求网络,网络数据请求回来放在内存中。然后,回到主线程更新下界面,就显示出来网络上的数据了。
我在学校学习的时候这一个部分是省略的。当时老师也是教过Java开发图形界面,当时别说线程是什么都不知道,Java进入主函数应该是停下来的。为什么java开发出来的图形界面没有停下来?包括Android只知道在哪里进入我写的代码,为什么不停呢?其实Java 和Android有这样的循环机制的,对于一个初学者来说,并不明显。
我当时还是碰到这些问题,比如说不同页面之间的相互传值。C语言最原始的逻辑是,一个是大哥页面,一个小弟页面。大哥页面要包含小弟页面,小弟页面一显示就能接收到大哥传给他的数据了。目前商业的要求是,小弟要向大哥反馈情况。难办了,绝对不行小弟页面在包含回去大哥页面。这样做逻辑很荒谬呀。iOS开发,这样办。大哥页面当中有一段代码自己不执行,小弟页面去使用大哥留给他的这段代码。这样就做到了,小弟向大哥反馈情况了。Android开发就不是这样的,通过intent传递。intent是如何传递的呢?不清楚,书上是这么写的。我当时学的时候老师也教过,当时并没有感觉。这并不重要呀。
对于我来讲,iOS开发体现出来了最原始(最c语言)的逻辑。如果当时我在学校学的是Android开发或者其他开发,为什么这样呢?有人说,人家规定好了就是这样的。怎么别地方又不行了呢?人家那个地方就是那样规定的,记住就行了。iOS开发,不是教条主义讲究最本质的逻辑。相似的还有PHP,我原来不知道啥是PHP。我学Linux的时候听到过PHP,才明白原来Java不是用来编写图形界面的,而是编写和PHP一样程序的。而且PHP比Java简单,市场占有率还高,开发速度还快,还有指针。对于一个初学者来说,讲Java EE完全听不懂在说什么!没有见过的事情很难理解的。我记得当时讲sql server的时候,我这个win7经不起你们这些人访问就死机了,windows server就可以。为什么可以就是可以,没有为什么。高考之前谁听说过windows server?我学Linux运维的时候不一样,Linux运维干什么的?运行和维护网络服务的。什么是网络服务呢?一台计算机去访问另外一台计算机。在Linux上面我们两台计算机不是windows7和windows2008的区别,而是我们两台机器是一样的。只不过内通不一样,我是服务端你是客户端。然后,在Linux上面安装Apache、PHP、mysql,一下子就懂了。