BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

iOSCon China 2012系列报道——技术篇

| 作者 丁雪丰 关注 4 他的粉丝 发布于 2012年3月28日. 估计阅读时间: 9 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

3月25日,由多个社区联合主办的iOSCon China 2012大会在上海及多个分会场(北京、杭州、武汉、广州、澳大利亚)顺利召开,现场及线上直播的总参与人数超过800人,多位国内知名的iOS开发者就移动互联网的发展趋势、产品设计以及开发技巧等诸多话题做了精彩分享。

既然是iOS开发者的大会,肯定少不了技术方面的话题。iOS第一个输入法iCosta for iPhone以及RockPlayer for Android的主要开发者之一李亮(@holly_lee)在他的主题演讲中引用了大量数字分析了各个厂商、设备、系统以及地区的占有量,随后大致介绍了如何选择移动应用开发的技术路线:

  • 操作系统。关注系统本的能力,是否支持多任务、是否支持后台执行,操作系统是否有限制,在安全性和隐私保护上表现如何。
  • 设备本身。关注设备的计算能力、图形能力、各种数据采集设备、各种传感器、分辨率、键盘以及CPU指令集的差异。Android设备厂商众多,不确定性也多,而iOS设备规格比较统一。
  • 云端服务。云端能够提供的服务,带宽如何,需要自己搭建还是利用现有服务?
  • 平台。即平台的市场比率,成熟度、稳定性,是否有成熟的分发方式和支付方式。
  • Native应用还是Web应用?两者各有优劣,比如本地应用体验稍好,两者会长期共存。
  • 跨平台。是否考虑使用现有的跨平台方案,例如PhoneGap
  • 用户体验。这点现在越来越重要了,应用必须具备良好的用户体验,不能花哨,不能喧宾夺主。

来自盛大创新院的孔详波(@ventrua)为大家分享了在iOS开发过程中如何进行调试,他的内容让一些在场的听众表示能将调试做到这种地步,令人佩服。在介绍了iOS应用的启动过程之后,孔详波罗列了一些他所常用的工具:

名称 用途
file 确定文件类型
strings 从二进制文件中查找某个字符串
otool 查看程序使用的动态链接库
class-dump 分析Mach-O文件,查看Objective-C的运行时信息,例如头文件信息
nm 显示符号表中的名字

此外,针对Xcode项目的编译,除了会用到xcodebuild,还有gcc、clang这样的编译器,提取二进制符号的dsymutil,进行代码签名的codesign,打包发布的PackageApplication等大量工具。

分析代码时,分为静态分析与动态分析两部分。静态分析可以选择LLVMClang Static Analyzer。动态分析则主要以日志输出为主,在输出日志时有一定的技巧,例如,使用系统提供的预定义宏,如__func__ 、__LINE__、__FILE__;对标准的输出进行重定向;对日志输出做条件编译,调试时输出,在正式发布时不输出。通过iPhone配置实用工具可以看到系统及第三方应用的日志,在应用发布之后,设备连接iTunes后会同步一些Crash Reports到服务器上,这时开发者也能获取到这些信息。

如果遇到了UncaughtException也不用慌张,一般遇到EXC_BAD_ACCESS这种和操作系统相关的内存错误,系统会返回SIGBUS或SIGSEGV BSD信号,仔细分析总能找到原因;而SIGABRT这样的异常通常不会像前者那么“底层”,可能是数组越界之类的问题。他还推荐了一篇文章《Handling unhandled exceptions and signals》,其中给出了一个处理异常的范例项目

在调试过程中,Xcode提供了很多有用的功能,例如Run sysctl.app中的Enable Zombie Objects可以用来查看僵尸对象;Debug Workflow中的Show Disassembly When Debugging甚至还能显示汇编代码。XCode中提供了两种类型的断点——Exception Breakpoint和Symbolic Breakpoint,可以根据需要进行选择,调试区域内可以看到断点的堆栈信息。还有最近兴起的、苹果资助的调试工具LLDB,具备速度快、高效、准确、可扩展、可重用等诸多优点于一身。孔详波建议大家紧跟技术发展,GDB固然好用,但最好还是能使用新的工具和功能。当有人对LLDB不支持3.0这样的旧系统提出质疑时,他认为不能因为这些原因就对LLDB心存戒备,还是应该有所尝试,而且仅支持3.0的设备的用户也未必就是你的主要目标用户。

大众点评的移动研发首席工程师屠毅敏(mmin18)的演讲《iOS应用开发最佳实践》是整个大会的最后一场主题演讲。开篇他就指出如果精力有限,不要钻牛角尖,把精力放在用户看得到的地方,花大力改进一个单例的写法,用户未必能体会到。

策划一款产品时,不要只想着做平台,不要想着如何整合他人的资源;要让用户一眼就能明白这个应用是做什么的,尤其是产品的名字和图标是很重要的。设计时,一定要记住图标是最重要的UI元素,一定要在真实的设备下体验运行的效果,开发与设计是一个不断迭代的过程。

该演讲的重点是开发中的最佳实践。屠毅敏谈到了苹果力推的MVC框架,虽然看起来很美,一旦项目大了,难免会有一些混乱,因此在开发时要尽量避免横向的交互,例如同级的控制器不能直接相互调用。iPhone的屏幕大小未必就是固定的,偶尔在显示时下面会少掉一条,可能是20像素,遇到这种情况,可以在Interface Builder里设置Autosizing进行解决。针对键盘事件,iOS给了开发者很大的自由度,比如键盘的高度不是固定的,键盘可以跟随滚动条移动等等,他提供了一个范例,希望有更多的人能够协助一起进行完善。此外还提到了一些小技巧:

  • 代码中多使用property,少声明成员变量
  • 使用()作为Category,而不是(Private)的Category
  • dealloc写在@synthesize后面,一一对应,避免出错
  • init和dealloc中要避免副作用,直接置null可能会引起一些莫名其妙的问题
  • 赋值时先判断下可能会让人觉得麻烦,但不这么做又可能会有问题,可以用[foo autorelease],性能方面的影响其实不大
  • viewDidLoad可能会被调用多次,而viewDidUnload可能并不会被调用到
  • 使用NSNotificationCenter时,避免直接removeObserver:self,这样可能会把父类注册的东西都remove掉

新浪微博和大众点评的应用都采用了Native与Web结合的开发方式,屠毅敏认为采用Web方式能够实现快速开发、快速迭代,有很强的灵活性,并且能跨平台、跨版本,应用可以先从Web起步,逐渐迁移到Native上。在基于URL的应用中,应用能注册自己的URL,实现不同应用的互相调用(比如支付宝安全支付),这样的调用方式更加直观,还可以看到URL栈,统计用户行为。在重Web轻Native的应用中,还需要使用JavaScript Bridge,Web调用Native时采用URL Bridge,Native调用Web时则是JS注入。

网络速度也是一个重要的因素,每秒对人均PV的影响是15%,应该尽量将响应时间控制在4秒以下。对于小数据量传输而言,2G和3G的区别并不大,响应速度才是关键。尽量在同一时间段内、在一个HTTP请求中传输所有数据,充分利用移动连接“预热”后的那段时间。

说到参考资料,多位嘉宾都说苹果的官方文档就是最好的学习材料,有能力的话最好能够阅读英文的材料。另外可以关注WWDC所放出的大会资料,从中可以学习到很多东西。

如果您对iOS开发及本次大会的内容感兴趣,主办方会在大会结束后整理并提供各位嘉宾的演讲视频及讲稿,请访问大会官网,也可以关注其官方微博(@iOSConCN)。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT