徐哲@www.xuzhe.com

Latest

既然给空指针发送消息不会崩溃,那么我们是否还有必要在发消息前判断一下指针是否为空?

在知乎上有人问到说,斯坦福课程里推荐不用判断 nil。但是有时候不判断 nil 又会导致程序崩溃,例如往 NSArray 里插入一个 nil 的情况。

以下是我的回答:

不管斯坦福怎么说,我的建议是如果这个指针可能为空,那么用之前都做一下判断。

为什么这么建议呢?

首先,最实际的理由是,给空指针发消息是非常慢的,而做一下 if 判断是否为空是非常快的操作。
这个速度上的差别是百倍这个单位的。

为什么呢?因为给 nil 发消息这件事情是在运行时判断的,而系统也并非简单的丢掉这个消息,系统还需要判断这个消息是否需要返回值,如果需要,还要判断返回值的类型:如果返回指针、数字、真伪等,则返回 0,如果返回的是 OS 定义过的数据结构,那么会返回一个被填充上 0 的结构回来,如果返回的是其它类型,则系统会返回一个未定义的类型回来。而一个 if,则能够直接跳过这些运行时的处理。

我做过一个实验:

分别是两个100万次的循环,其中一个给 nil 对象发送了 100万次消息,另外一个循环在发消息前,会判断一下该对象是否为空。

实验的结果是两个循环的执行时间相差了200多倍。这还是消息中没有传任何参数的情况。

这就好像我们不建议用 try cache 来做本可以用 if else 判断掉的错误处理一样,因为开销太大。

另外,“给空指针发消息不会崩溃”是语言特性,是为了防止人为失误导致程序崩溃的“保险”机制。我们写代码时应该尽量避免依赖语言特性的写法,因为这不利于代码(逻辑)移植,语言特性本身也是会变化的(哪怕变化的可能性为零)。

最后,这能养成一个好习惯,培养出一个好的思维方式。上述的这种遇到“错误”也让程序继续跑下去的语言特性本身就是有争议的,虽然给 nil 发消息不会崩溃,但也正是由于程序不会崩溃,当你的代码写错时你也无法察觉到,你的程序有可能会进入一个你完全没有预期到的状态,看似一切正常,但返回的结果却是完全错误的。而写代码时花1秒钟加一个简单的 if 判断,就能够清楚地看出哪个指针是可能为空的,这些信息在分析代码问题的时候是非常宝贵的。

MacBook Pro 应当电池用完后充电,还是用到 20% 时充电?

该用就用,想充就充。不要总是在同一个位置开始充电,甚至不需要每次都等到电池被充满了才拔掉电源。

因为锂电池更喜欢没有规律的充放电,总是让电池保持在充满或者完全空掉的状态,是让号称没有记忆现象的锂电池出现记忆现象的最好办法。

如果你把笔记本当台式机用,那么至少每个月做一次充放电(也不需要每次都完全放完)。

另外为何不去看看苹果的网站,人家有权威的官方建议,甚至还能给你的 iCal 加上一个充放电提醒的 event。

http://www.apple.com/batteries/notebooks.html

作为一个普通的网民如何能体验到“云计算”的相关应用?

个人认为,作为普通网民,你完全没必要刻意去体验所谓的“云计算”。因为早在“云计算”这个概念被提出来之前,你所使用的大量网络服务其实就已经完全符合了“云计算”的定义了。

例如 Email 邮箱的 Web 界面,就相当符合现在的“云计算”的定义。以 Gmail 为例,你的所有邮件都存储在“云端”——Google 的服务器上,你在任何一台电脑上都能直接通过浏览器打开邮箱中的邮件。

再比如当年,在互联网尚且不发达的时候流行过一阵子的所谓“终端机”系统。通常由一堆只有极低 CPU 和 极少内存的“终端”,加上一台或若干台强劲的服务器组成。终端机主要负责接受鼠标键盘输入和显示内容,实际处理操作都是在服务器上完成的。后来随着 PC 成本的下降,这类终端机系统几乎消失了。但是,这种“终端机”系统却是相当符合今天的“云计算”定义的——至少也是块“本地云”。

还有很多例子,就不一一列举。现如今之所以到处都充斥着“云计算”的字样,其实绝大多数情况只不过是各家公司“与时俱进”的商业宣传手段而已。

所以,就像当初的 “Web2.0” 一样,“云计算”其实并不是什么新鲜的事物,这只不过是技术人员对计算机产业发展趋势进行总结和归纳后创造出来的一个名词而已——这里摘录一段 Wiki 百科上关于“云计算”发展历史的文字,大家可以看看“云计算”这个名词出现得是多么的晚。

1983年,升阳电脑(Sun Microsystems)提出「网络是电脑」(「The Network is the computer」)。

2006年3月,亞馬遜(Amazon)推出彈性運算雲端(Elastic Compute Cloud;EC2)服務。

2006年8月9日,Google行政總裁埃里克·施密特(Eric Schmidt)在搜索引擎大会(SES San Jose 2006)首次提出「雲端計算」(Cloud Computing)的概念。Google“云端计算”源于Google工程师克里斯托弗·比希利亚所做的“Google 101”项目。
另外,由技术人员总结出的“云计算”这个概念,涵盖了相当广泛的范围。目前普遍认为“云计算”产业分为三个层次,即 云端软件 Saas(软件即服务),云端平台 Paas(平台即服务),云端设备 Iaas(基础设施即服务)。看名字可以大概猜出这三个层次各是怎么回事儿,具体解释请自行 Google + Wiki,我就不细说了。

上面说到的 Gmail,就非常接近 Saas 的定义,而“终端机”则非常接近 Iaas。这都是普通用户有机会体验到的。至于 Paas,通常是开发人员才比较有机会“体验”到(作为普通用户,通常是分辨不出架设在云平台上的网站和架设在传统意义上的服务器中的网站的区别的)。

作为普通网民,如果你发现无论你在何时何地,无论用哪一台电脑(甚至手机),在使用同一个应用(软件或者网站)时,就像压根儿没有换过电脑,没有挪过地方一样,那么恭喜你,你“云计算”了。

关于 iOS 界面交互设计,有哪些比较好的书籍?

我认为,不要看书。

要入门,看苹果的官方 Guideline 足以。
要提高?看书不如看实际的 App。

多订阅国外知名 blog,遇到他们介绍的新 App 就下载下来用,把买书的钱拿去买 App,向牛人的作品学习,琢磨伟大的 App 的设计思路,才是正路。

看书?除非写书的那位作者真的有实际的、在 App Store 上被用户认可的作品,这本书也许还值得花时间一看。但你也必须知道设计潮流这件事情是不断在变化的,就算是大师写的书,也许等他的书写完,印刷出版,再被你拿到手里的时候,App Store 上的最新设计风格已经变了。

我甚至可以不客气地说,这年头跑来写所谓 iOS UI 界面交互设计的书的人,99% 都是把苹果的 Guideline 换个说法讲一遍,加几句是个人就知道的所谓“真理”,然后再把他自己玩别人 App 获得的一些感想说出来的投机分子。

如果有人觉得光是拿着一个很多人都说赞的 App 还是无法理解其中的奥妙,非看书不可,那么我觉得这样的同志还是赶紧放弃设计 iOS UI 和用户体验这件事儿,找个自己擅长的方面去发展吧。

偷懒 2.0

之前说过,由于有了方便随时更新思维片段的 Twitter,我已经越来越缺少动力来写 blog 了。

因为这个世界上 140 个中文字说不清楚,而我又能说清楚的事情实在是不多。

于是我决定把我在其他一些网站上回答别人问题的答案——一些我个人认为回答得还比较靠谱的,直接拷贝过来。

虽说是有点儿重复的冗余信息,但考虑到不是每个人都会去我去过的每个网站,有个地方自己给自己做个总结还是必要的,也权当给自己的 blog 增加一点儿生气。

 

另外,我很懒。一般不会把别人写的东西费力贴到自己 blog 里来。也正因为我懒,贴在自己 blog 里的就一定是我自己写的。

所以如果有人不巧在别的地方看到同样的文字,而又碰巧不是由我发的,那么你八成是遇到了“季達”。