许多人认为Objective-C这门语言芜杂、笨拙、别扭,但笔者却看到其雅致、灵活、美观的一面。然而,为了领略这些优点,大家不仅要掌握基础知识,还要理解语言中的特性、陷阱及繁难之处。本书正是要讲述这些内容。
关于本书
本书假定读者已经熟悉了Objective-C的语法,所以不再赘述。笔者要讲的是怎样完全发挥这门语言的优势,以编写出良好的代码。由于其源自Smalltalk,所以Objective-C是一门相当动态的语言。在其他语言中,许多工作都由编译器来完成;而在Objective-C中,则要于“运行期”(runtime)执行。于是,在测试环境下能正常运行的函数到了工作环境中,也许就会因为处理了无效数据而不能正确执行。避免此类问题的最佳方案当然是一开始就把代码写好。
严格地说,许多话题与Objective-C的核心部分并无关联。本书要谈到系统库中的技术,例如libdispatch库的“大中枢派发”(GrandCentralDispatch)等。因为当前所说的Objective-C开发就是指开发MacOSX或iOS应用程序,所以,书中也要提及Foundation框架中的许多类,而不仅仅是其基类NSObject。不论开发MacOSX程序还是iOS程序,都无疑会用到系统框架,前者所用的各框架统称为Cocoa,后者则叫CocoaTouch。
随着iOS的兴起,许多开发者都涌入Objective-C开发阵营。有的程序员初学编程,有的具备Java或C++基础,还有的则是网页开发者出身。为了能高效运用Objective-C,无论是哪种情况,你都必须花时间研究这门语言,从而写出执行迅速、便于维护、不易出错的代码来。
尽管这本书只用6个月就写好了,但是其酝酿过程却长达数年。笔者某天心血来潮,买了个iPodTouch,等到第一版SDK发布之后,就决定开发个程序玩玩。我做的第一个“应用程序”叫“SubnetCalc”,其下载量比预想中要多。于是我确信,以后要和这个美妙的语言结缘了。从此就一直研究Objective-C,并定期在自己的网站上发表博文。我对该语言的内部工作原理,诸如“块”(block)、“自动引用计数”(AutoReferenceCount,ARC)等特别感兴趣。于是,在有机会写作一本讲Objective-C的书时,自然就当仁不让了。
为使本书物尽其用,笔者建议大家跳读,直接翻到最感兴趣或与当前工作有关的章节来看。可以分开阅读每条技巧,也可以按其中所引用的条目跳至其他话题,互相参照。相关技巧归并成章,读者可根据各章标题快速找到谈及某个语言特性的数条技巧。
目标读者
本书面向那些有志于深入研究Objective-C的开发者,帮助其编写便于维护、执行迅速且不易出错的代码。如果你目前还不是Objective-C程序员,但是会用Java或C++这样面向对象的语言,那么仍可阅读此书。在这种情况下,应先了解Objective-C的语法。
本书主要内容
本书不打算讲Objective-C语言的基础知识,在许多教材和参考资料中都能找到那些内容。本书要讲的是如何高效运用这门语言。书中内容分为若干条目,每条都是一小块易于理解的文字。这些条目按其所谈话题组织为如下各章。
第1章:熟悉Objective-C
通论该语言的核心概念。
第2章:对象、消息、运行期
对象之间能够关联与交互,这是面向对象语言的重要特征。本章讲述这些特征,并深入研究代码在运行期的行为。
第3章:接口与API设计
很少有那种写完就不再复用的代码。即使代码不向更多人公开,也依然有可能用在自己的多个项目中。本章讲解如何编写与Objective-C搭配得宜的类。
第4章:协议与分类
协议与分类是两个需要掌握的重要语言特性。若运用得当,则可令代码易读、易维护且少出错。本章将帮助读者精通这两个概念。
第5章:内存管理
Objective-C语言以引用计数来管理内存,这令许多初学者纠结,要是用过以“垃圾收集器”(garbagecollector)来管理内存的语言,那么更会如此。“自动引用计数”机制缓解了此问题,不过使用时有很多重要的注意事项,以确保对象模型正确,不致内存泄漏。本章提醒读者注意内存管理中易犯的错误。
第6章:块与大中枢派发
苹果公司引入了“块”这一概念,其语法类似于C语言扩展中的“闭包”(closure)。在Objective-C语言中,我们通常用块来实现一些原来需要很多样板代码才能完成的事情,块还能实现“代码分离”(codeseparation)。“大中枢派发”(GrandCentralDispatch,GCD)提供了一套用于多线程环境的简单接口。“块”可视为GCD的任务,根据系统资源状况,这些任务也许能并发执行。本章将教会读者如何充分运用这两项核心技术。
第7章:系统框架
大家通常会用Objective-C来开发MacOSX或iOS程序。在这两种情况下都有一套完整的系统框架可供使用,前者名为Cocoa,后者名为CocoaTouch。本章将总览这些框架,并深入研究其中某些类。
致谢
在问到是否愿意写一本Objective-C的书时,我立刻兴奋起来。读过了Effective系列其他书后,我意识到要想写好这本Objective-C书籍可真是个挑战。然而在众人协助之下,这本书终于和大家见面了。
书中好些灵感都源自许多专述Objective-C的精彩博文。笔者要感谢博文作者MikeAsh、MattGallagher及“bbum”等人。多年来,这些博客帮助我更深地理解了Objective-C语言。在编撰本书时,NSHipster及MatttThompson所写的优秀文章也启迪了我的思路。还要感谢苹果公司提供了极为有用的开发文档。
在供职于MXTelecom期间,得良师益友之助,我学到了许多知识,若没有这段经历,恐怕就无法完成此书了。感谢MatthewHodgson,令我有机会以一套成熟的C++代码库为基础,开发出公司首个iOS应用程序,在该项目中学到的本领为我参与后续项目打下了基础。
感谢历年来保持联系的各位同仁。大家时而切磋技艺,时而把酒言欢,这对我写作本书来说都是种帮助。
与培生集团旗下团队的合作相当愉快。TrinaMacDonald、OliviaBasegio、ScottMeyers及ChrisZahn都在需要时给我以帮助与鼓励。诸位为我提供了专心写书的工具,并回答了必要的问题。
笔者同技术编辑合作得也非常融洽,你们给了我莫大的帮助。仰赖严格的审校,方能使本书内容臻于完美。诸位在检查书稿时认真细致的态度,也令人称赞。
最后我要说,此书能问世,爱妻Helen的理解与支持必不可少。准备动笔那天,我们的第一个孩子降生了,真正开始写作是在几天之后。Helen与Rosie伴我顺利写完这本书,你们俩真棒!