如何在MonoTouch和Objective-C之间做出选择?

274

在本地的一个 .Net 事件上参加了一次有关 Mono 的会议后,我们接触到使用 MonoTouch 作为 iPhone 开发的替代方案。由于我非常熟悉 C# 和 .Net,所以尽管 Mono 栈存在一些怪异之处,但它似乎是一个吸引人的选项。然而,由于 MonoTouch 要花费 400 美元,我有些犹豫这是否是进行 iPhone 开发的正确方式。

有没有使用 MonoTouch 和 Objective-C 进行开发的经验,如果有的话,使用 MonoTouch 是否比学习 Objective-C 更简单和快速,进而是否值得花费 400 美元呢?


13
我认为很多关于MonoTouch无法在iOS上运行的评论现在已经不再有效,因为苹果放松了其开发工具限制。参见:http://www.apple.com/pr/library/2010/09/09statement.html - sivabudh
14个回答

2
我建议您投入时间学习Objective-C,主要是因为像这样的网站提供了很多帮助。Objective-C 的优点之一是可以使用 C 和 C++ 代码,而且有许多经过充分测试的项目。
另外一个好处是,您选择的编程语言将得到苹果的支持。例如,如果 iOS 5.x 删除了对 MonoTouch 这样的第三方解决方案的支持,那么您将如何向客户解释?
如果您还没有准备好完全转向 Objective-C,也许使用像 HTML5 这样的跨平台解决方案会更好。

我认为使用MonoTouch会被锁定在一个供应商上,而这个供应商可能会停止允许/支持。你最终可能会投资于一个完全受苹果控制的平台...因为他们有自己的开发平台。 - jl.

2
我已经使用MonoTouch几个月了,我将未完成的应用从ObjectiveC移植过来,这样我以后可以支持Android。
以下是我的经验:
缺点:
- Xamarin Studio。像我这样的独立开发者被迫使用Xamarin Studio。它每周都在变得更好,开发人员非常活跃在论坛上识别和修复bug,但它仍然非常慢,经常挂起,有很多错误,而且调试也很慢。 - 构建时间。为了在设备上进行调试构建我的大型(链接)应用程序可能需要几分钟,而这与XCode部署几乎是立即完成的相比。在模拟器(非链接)上构建会更快一些。 - MonoTouch问题。我遇到了由事件处理引起的内存泄漏问题,并不得不放置一些非常丑陋的解决方法来防止泄漏,例如在进入和离开视图时附加和分离事件。Xamarin的开发人员正在积极研究此类问题。 - 第三方库。我花了很多时间将ObjectiveC库转换/绑定为我的应用程序使用,尽管随着自动化软件例如ObjectiveSharpie的出现,这种情况正在改善。 - 更大的二进制文件。这并不真正困扰我,但我想提一下。在我看来,几兆字节的额外空间现在已经不算什么。
优点:
- 多平台。我的朋友正在从我的核心代码库中愉快地创建Android版本的应用程序,我们并行开发,并将其提交到Dropbox上的远程Git存储库,进展顺利。 - .Net。在C# .Net中工作比Objective C更好。 - MonoTouch。在iOS中几乎所有东西都在.Net中得到了反映,而且很容易让事情正常运转。 - Xamarin。你可以看出这些家伙确实在努力改善一切,使开发更加顺畅和容易。
我强烈推荐使用Xamarin进行跨平台开发,特别是如果你有使用与Visual Studio配合使用的商业版或企业版的资金。
如果你只是创建一个永远不需要在其他平台上使用的iPhone应用程序,并且你是独立开发者,我建议你暂时坚持使用XCode和Objective C。

关于我之前的回答,我来快速更新一下。自从换了一台更快的 Mac 电脑后,我发现构建时间快了很多,虽然还不像 XCode 那样瞬间完成,但已经足够好了。 - danfordham

1
作为一位有C#和Objective-C经验的人,我认为对于大多数人来说,Xamarin是物有所值的。
C#是一种设计良好的语言,其API也很好地设计了。当然,Cocoa Touch API(包括UIKit)也具有出色的设计,但该语言在某些方面可以改进。使用C#编写代码时,您可能比使用Objective-C编写相同的代码更加高效。这是由于几个原因,但其中一些原因可能是:
  • C#支持类型推断。类型推断使得编写代码更快,因为您不必“知道”赋值操作的左侧的类型。它还使得重构更容易且更加安全。

  • C#支持泛型,相比等效的Objective-C代码可以减少错误(尽管在Objective-C中有一些解决方法,在大多数情况下开发人员会避免使用它们)。

  • 最近Xamarin添加了对Async / Await的支持,这使得编写异步代码非常容易。

  • 您将能够重用iOS、Android和Windows Phone部分代码库。

  • MonoTouch在很大程度上以非常直观的方式实现了CocoaTouch API。例如:如果您具有CocoaTouch的经验,则会知道在MonoTouch中查找控件类的位置(MonoTouch.UIKit包含UIButton、UIView、UINavigationController等类,同样,MonoTouch.Foundation包含NSString、NSData等类...)。

  • Xamarin将为用户提供本机体验,而不像PhoneGap或Titanium这样的解决方案。

现在,Objective-C相对于C#有一些优势,但是在大多数情况下,使用C#编写应用程序通常会导致开发时间更短、代码更清晰,并且将同一应用程序移植到其他平台的工作量更少。一个值得注意的例外可能是依赖OpenGL的高性能游戏。

-35

MonoTouch库的成本完全无关紧要。您不应该在iPhone应用程序中使用Mono的原因是它是一个支撑。如果您不能费心学习本地工具,那么我没有理由相信您的产品值得下载。

编辑:2010年4月14日,使用MonoTouch编写的应用程序不符合iTunes Store的条件。这是应该的。苹果在Mac上看到了很多浅层次的端口,使用跨平台工具包如Qt或Adobe自己的System 7工具箱的部分重新实现,长话短说,它们并不够好。


14
Mac OS X的市场份额非常小,因此iPhone是许多人考虑使用X-Code和ObjC的唯一引人注目的原因。15年前它们都很棒,当时还叫做Project Builder,可以进行跨平台的编译和打包,但是说实话,作为一个使用多个平台的人来说,现在有更好的工具和语言可供选择,开发人员希望利用共同的代码库和使用其他开发工具并不足为奇。这并不意味着他们的创作会变得低于标准。 - Iain Collins
37
我不确定,伙计……我认为Objective-C和CocoaTouch是一种依赖工具。如果你不写汇编语言的话,我会觉得你可能并不太在意,那我就不会下载你的应用程序(因为用户当然会首先检查用于构建其正在下载的放屁模拟应用程序的工具)。 - Rory Blyth
3
安德鲁,你并不了解自己在说什么。Objective-C并非是一个落后的技术;它是Mac、iPhone和iPad本地开发环境的支柱。请注意,此处只是翻译内容,不涉及任何解释或其他额外信息。 - NSResponder
5
那么,您选择了一个苹果公司内置到框架中的简单示例,并宣称其优越性,却方便地忽略了该框架中比C#等效部分要笨重得多的部分?这不是一种伪命题的论证吗? - Andrew Rollings
8
我转而使用MonoTouch,并已在4.0上发布了47个应用程序。我全职进行此项工作。效果非常好,速度快。我曾经使用Objective C编写代码,但发现C#与Linq更快且需要编写的代码量更少。 - Ian Vink
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接