Somya Jain 谈从 C# 到 Objective-C

几年前掌上电脑很大程度上就是一新奇事物和玩具。但如今,商业界正发生着一场重大变化。许多传统上在XAML,Flex或HTML上编写应用的商业公司突 然发现,iPad应用有着数目巨大的需求。这些需求不止来自游戏,同时也存在很多标价为几十万甚至上百万的项目。尽管.Net和Java在未来几年依然会 活跃于后端平台。但是对于那些愿意尝试的团队,iOS市场还是有很多机会。

我们与Somya Jain,一个致力于此的开发人员,谈论了如何从C#过度到Objective-C。

Somya Jain:关于移动编程我学到的第一点是(通过不断实践总结出来的),它与服务器或桌面开发有着很 大的不同。移动设备RAM空间小,网速慢,屏幕小;尤其CPU,相对慢。尽管如此,人们却期待移动设备提供更高的用户体验。人们可以很容易地在应用商店将 你的应用与其它应用进行对比。如果你的应用还是停留在作坊级,那就很难具有竞争力。

我学习Objective-C就是为了编写iPhone及iPad应用。因为拥有C++/Java/C#背景,其学习并非那么困难。大部分概念都能简单互通。一开始,我尝试通过遵循书籍和阅读文档来学习,但是,我发现更快的学习方法是真正投入到项目中。

以下几点是理解Objective-C的关键。尽管它与C#有很多相同之处,但依然有细微的差别。

内存管理

首先需要提的就是内存管理。对于iOS开发,理解alloc,release和autorelease是至关重要的。但是随着ARC的引进,它们可能会变得不那么重要。尽管ARC会在某些地方误导你,但它将帮助你理解其内含的原理。

内存管理问题,比如过度释放内存,将造成令人厌烦的BAD_ACCESS崩溃;还有不释放内存,造成的难以解决的内存泄漏。此外,他们对应用的性能 和可用性也有很大影响。学会如何快速定位和解决这些问题非常关键,我建议学会如何使用NSZombies对象及性能调试工具Instruments来调试 这些问题。

另外,Objective-C支持垃圾回收,但它仅支持mac osx,而不支持iOS。

InfoQ:添加和释放对象听起来非常像COM引用计数,但“自动释放”又是怎么回事呢?

Somya:从根本上,你会使用自动释放返回一个不是由创建对象管理的对象。通过调用自动释放,将该对象添加到自动释放池中,并在清空池时将对象释放。如果接受对象想要使用它,需要保留其值。以下是更多来自apple文档的信息:

每个循环的每次轮询开始,应用工具箱都会在主线程中创建一个自动释放池,在并最后将其释放,以释放执行事件时产生的自动释放对象。

InfoQ:什么是NSZombies?

Somya:NSZombies可以用来检测之前提到的内存过度释放问题。在自动释放对象上不平衡释放是常见现 象。事实上,最终释放时,一切都工作正常,对象也被重新分配了;但是当清空自动释放池时(有的时候随后才发生),应用会因为尝试去自动释放一个已经被释放 的对象而崩溃。正因对象本身不存在,所以很难定位出真正问题所在。正是对应上述问题,提出了NSZombie对象。通过设置 NSZombieEnabled标志将任何已释放对象转化为NSZombie,以取代原始释放操作。这样我们就可以在任意调用NSZombie对象释放或 自动释放处设置断点,以定位到问题代码路径。

InfoQ:您能解释下什么是ARC,为什么您觉得它可使内存管理更简单?

Somya:原则上,通过允许使用ARC,编译器会自动为你保留或释放请求。这意味了我们不必再去担心内存管理了,但是经验告诉我:事实正与之相反。我还没使用过ARC,所以无法做过多评论。

方法调用VS消息

两个语言间另外一个细微差别是:C#中方法调用是静态的,绑定发生在编译时(暂时忽略动态编译)。Objective-C消息则在运行时动态绑定对象,而非编译时。这意味着你可以发送任意定义好的消息给对象,编译器都不会报错。错误会在运行时抛出。

有意思的是,其中有一机制:就算消息没有被类执行,也会被截取。这通常发生在多继承,日志和往动态载入代码分配消息等高级方案中。

进程池VS中央调度

从高层来说,它们的定义是一样的:一个用于管理进程池的系统。对于该点,我认为iOS确实做得很出色。首先,它支持不同优先等级,甚至进程池也赋予我们更优的授权管理。比如我们可以在下载图片时操纵更高等级的进程,以使后台下载不影响我们的UI。

另一优秀特征是分配组允许同时提交所有任务,但只在全部完成时才通知。

以下概念在C#和Objetive-C中几乎一一对应:

  • 扩展方式(C#)<==>类别(iOS)
  • 接口(C#)<==>协议(iOS)
  • 委托(C#)<==>块(iOS)

C#中我怀念的:

  1. 泛型
  2. LINQ
  3. 不用创建头文件,将代码置于同一文件中。

给C#开发者的其它建议:

  • 从Resharper(C#)开发者那了解AppCode(Objetive-C)
  • Xamarin的MonoTouch团队将C#引入到iOS设备中。

InfoQ:对iOS开发,您偏向哪种IDE呢?

Somya:当然是AppCode了,我非常熟悉它所带来的代码自动完成和重构支持,就如同C# 中使用过的一样。我还喜欢它能够突出显示那些潜在的内存管理问题,对于iOS的初学者非常有帮助。一天下来,那大大提高了我的生产力,简直不费吹灰之力。

InfoQ:您说您想念泛型。那Objective-C提供类似工具吗,还是必须象.Net1.0那样必须使用非类型化集合?

Somya:是的,我们使用类似1.0中非类型化集合。但是由于动态消息绑定,我们无需停止对象去发送消息。

InfoQ:Objective-C是否有哪些特征您希望C#能采纳呢?

Somya:在语言层上应该没什么。我还不曾发现有哪些显著特性让我觉得C#也应该拥有。但是在API层上,我 觉得apple确实在iOS上下了很好的功夫。尽管其API看上去有点严格,但是确实设计地很好。比如在NavigationController和 UITabBarController里,通过简单标志就可在视图切换时实现动画效果。而在android和WP7中,这要消耗很大力气。

InfoQ:如何比较在iOS中,和在WinForms或Silverlight中创建用户界面呢?

Apple有两个主要UI库:UIKit和GLKit。GLKit主要关注基于OpenGL的应用和游戏。UIKit更接近于 WinForms/WPF,它有类似text boxes文本框,labels标签,drop downs下拉列表等标准控件。这些UIViews(.Net中的控件)易拓展成或组合成试图,类似于.Net中创建自定义控件和用户控件。但是,iOS 只支持固定的基于坐标的布局,所以我们必须明确具体大小及每个视图在其父试图中的位置。其他UI定义就比较相似,比如:

  • 依然有视图结构
  • 当往后台进程导入数据时,依然要小心;并将其整合到主进程中去。
  • 需了解视图生命周期等。

文/InfoQ

    三星再次声明对 RIM 和黑莓 10 系统没兴趣

    针对RIM正考虑向三星授权黑莓10操作系统的传言,三星周二宣布,不考虑生产黑莓系统手机或收购RIM。近期,RIM正尝试通过各种方式来扭转其深陷泥淖的手机业务。对RIM来说,缺少像三星这样的潜在合作伙伴支持意味着更多的麻烦。

    周三早些时候,RIM股价上涨了5%,这得益于有分析师称该公司正考虑向三星授权BlackBerry 10操作系统。韩国Meritz证券公司分析师Lee Sei-cheol称:“在智能手机市场,RIM已经丧失了主动性,它剩余的东西看起来并不能真正吸引三星。但是RIM拥有大量的专利,这可能是吸引潜在 买主的最好资产。”

    目前三星是全球最大的智能手机生产商,也是谷歌Android平台智能手机销量最大的厂商。此外,三星还生产和销售基于微软Windows移动平台及其自有Bada平台的手机。

    三星在智能手机上采取多平台发力的策略,这引发人们的推测,该公司也可能寻求RIM黑莓系统的授权,并借此拉开与苹果等竞争对手的距离。或者,三星 可以通过多平台战略来使自己逐渐摆脱Android,因为该平台的拥有者谷歌通过收购摩托罗拉移动获得了硬件生产能力,外界猜测这可能损害会其它 Android平台手机制造商的利益。

    RIM打算在明年推出的下一代黑莓手机中采用其最新研发的黑莓10操作系统,该系统被认为是RIM应对市场份额持续下滑的最后希望。

    自2011年初以来,RIM的股价累计下跌超过80%,苹果等智能手机厂商则借机扩大了相对RIM的领先地位。和诺基亚一样,RIM曾经也是智能手机市场的领导者。

    受消息影响,周二三星股价收盘上涨1.5%,低于大盘2%的涨幅。

    文/新浪科技

    Win8 Metro UI 或更名为 Modern UI

    知情人士透露,为避免商标侵权纠纷,微软很可能对Windows 8的Metro界面进行新命名。在使用“Metro”一词上,微软与德国公司Metro AG存在分歧。为了避免纠纷,微软决定对Metro重新命名,但微软在新名称上也举棋不定。

    此前有报道称,微软将用“Windows 8”取代“Metro”,例如“Metro应用”将被重新命名为“Windows 8应用”,“Metro用户界面”将被重新命名为“Windows 8用户界面”。

    但最新消息显示,微软员工已经开始用“现代用户界面”(Modern UI)取代“Metro用户界面”(Metro UI)。在对未来的几场重要业界大会介绍页面上,微软也多次使用“Modern UI”字样。另外,在MSDN博客中,微软同样使用了“Modern UI”一词。(李明~新浪科技)

    Metro UI

    谷歌超级新福利曝光:员工去世配偶可领10年薪

    新浪科技 郑峻 发自美国硅谷

    最富有的科技公司?坐拥市值5800亿美元的苹果当仁不让。但对员工最为厚道的科技公司,或许谷歌有资格争夺榜首。谷歌为硅谷带来了互联网创新公司的文化典范,如今在硅谷创业公司逐渐普及的免费午餐就是谷歌率先实行的。

    除了丰厚的薪酬和加薪待遇之外,谷歌员工还可以享受到免费理发、洗衣以及洗车等诸多令人羡慕的福利,每年年终还能获得免费的最新款智能手机一部。 在产假方面谷歌也非常慷慨,每名男性员工在子女出生可以享受18个星期的产假,而且产假期间依旧可以享受股权授予。

    据《福布斯》报道,谷歌今年年初推出了一项新福利:如果员工不幸去世,其配偶还能在未来10年享受到去世员工的半数薪酬;他们未成年子女还能每月收到1000美元的生活费直至19岁成年。除了半数薪酬,配偶还能获得去世员工的股权授予。

    谷歌首席人力官拉斯洛·布克(Laszlo Bock)表示:“谷歌之前为年轻员工考虑了诸多福利,包括子女的抚养等方面,但在员工身后考虑得较少。失去伴侣显然是最痛苦的事情之一,我们希望想办法帮助那些不幸去世的谷歌人的配偶。”

    谷歌发言人证实了这一福利,(这项福利)是应该的(Right things)。这项福利没有工作期限限制,全球3.4万名员工均可享受。

    ABC今年年初的一项调查显示,谷歌是美国最受欢迎的科技公司,超过了苹果、Facebook和Twitter。82%的美国人对谷歌持有正面 态度,53%的受访者对谷歌抱有强烈好感,只有9%的人不喜欢谷歌。谷歌在年轻人中的受欢迎比例甚至更高(92%)。此次调查涉及1007名受访者。

    据美国员工福利网站Grassdoor.com统计,谷歌员工平均年薪为10.6万美元,仅在科技公司中排名第12位。排名前两位的是思科(12.2万美元)与雅虎(11.8万美元)。Twitter与Zynga排名第四与第五位。

    但在《财富》杂志的2012年美国100家最佳雇主排行榜上,谷歌排名第一,英特尔排在46位,微软排名第76位,思科排名第90位,苹果没有上榜。

    但一位微博用户评论:“这项福利实际上相当于谷歌自己为员工负担了一份100万的人寿保险,等于人均每年多付200美元(按照年薪20万美元计算)”。

    考虑到谷歌成立不到15年,实际去世员工数量并不多,真正享受到这份福利的员工家庭或许并不会太多,但这项福利给谷歌人才战略带来的无形效果则是难以估量的。目前谷歌人力资源部门每年收到超过200万份简历,入职员工需要通过至少6道面试关(此前是10道)。

    RIM 裁员3000人计划下周开始

    RIM不久前宣布将关闭旗下多家北美零售店,同时还公布了进一步裁员3000人计划的细节信息,这项计划即将在下周开始实施。公司在密歇根州的最后一家现有店面很快将被关闭,并将在8月13日宣布进一步裁员3000人。

    此外还有9家机场零售店也将关闭,此前该公司已在今年早些时候宣布裁员 5000人,当时RIM拒绝确认这一消息。

    http://img.cnbeta.com/newsimg/120811/0720360293721651.jpg