如何在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个回答

520

最近我看到了很多这样的问题(或类似的问题)。让我惊讶的是,人们经常回应,但真正提供答案的人却很少。

我有我的偏好(我喜欢两种技术栈),但这就是大多数“答案”开始出错的地方。它不应该是关于我想要什么(或任何其他人想要什么)。

以下是我确定使用MonoTouch价值的方法 - 显然,我不能客观地进行评估,但我认为这是相当客观的:

  • 这是为了娱乐还是商业用途? 如果您想进入此领域的咨询业务中,那么您可以非常快速地赚回399美元。

  • 您想要彻底了解平台,还是“只是”想为其编写应用程序?

  • 您是否喜欢 .Net ,以至于使用不同的开发技术栈会让您失去其中的乐趣?再次强调,我喜欢这两种技术栈(苹果和Mono),但对我来说,MonoTouch使体验更加有趣。 我没有停止使用苹果的工具,但主要是因为我“真的很喜欢这两种技术栈”。我喜欢iPhone,我喜欢 .Net。 在这种情况下,对我来说,使用MonoTouch是一个毫无疑问的选择。

  • 你是否擅长使用 C 语言?我指的不是 Objective-C,而是 C。这很重要,因为 Objective-C 就是 C。它是一个漂亮、时髦、友好的面向对象版本,但如果指针让你感到不适,那么 MonoTouch 就是你的朋友。不要听信那些认为如果你不喜欢指针(或者 C 等等)就是软弱开发者的人的话。我曾经带着 IBM ROM BIOS Pocket Reference 的一份副本四处走动,当我编写汇编语言并将计算机强制进入有趣的视频模式以及为它们编写自己的字体呈现部分和(虽然有点糟糕的)窗口系统时,我并不认为 QuickBasic 开发者是软弱的。我曾经是 QuickBasic 开发者(还有其他的开发)。永远不要屈服于书呆子男子主义。如果你不喜欢 C,如果你不喜欢指针,并且如果你想尽可能地远离手动内存管理(公平地说,在 ObjC 中实际上并不糟糕),那么...... MonoTouch。不要为此受到任何压力。

  • 你想要面向用户或企业吗?对我来说没什么区别,但是Edge上仍然有人在使用,事实是:如果使用苹果的技术栈,您可以创建一个远比较小的下载包。我一直在尝试使用MonoTouch,并且已经创建了一个很不错的小应用程序,一旦压缩后,大小只有约2.7 MB(提交应用程序进行分发时,需要压缩它-当从商店下载应用程序时,它们会被压缩-因此,在计算您的应用程序是否将在10MB的OTA限制以下时,请先压缩它-使用MonoTouch,您将感到非常满意)。但是,除了MT开心以外,如果您的目标是最终用户,则半兆与近三兆(例如)之间的差距可能对您很重要。如果您考虑的是企业工作,则几兆根本无所谓。并且,要明确一点-我将很快将基于MT的应用程序提交到商店中,并且我对其大小没有任何问题。这完全不影响我。但是,如果这是您关注的问题,那么苹果的技术栈在这方面胜出。

  • 进行XML工作吗?MonoTouch。没有其他选择。

  • 字符串操作?日期操作?其他数百万个.NET功能?MonoTouch。

  • Web服务?MonoTouch。

  • 从语法上讲,它们都有各自的优点。Objective-C倾向于在您必须编写代码时更冗长。您会发现自己使用C#编写代码,而在Objective-C中则不需要编写,但两者都一样。这个特定的主题可以填满一本书。我更喜欢C#的语法,但是在克服了我对Objective-C一开始的反应后,我已经非常享受它了。在演讲中,我会拿它开玩笑(对于那些习惯于C#/Java /等的开发人员来说,它确实很奇怪),但事实是我内心有一个Objective-C形状的地方让我感到快乐。

  • 你打算使用Interface Builder吗?因为即使在这个早期版本中,我发现使用IB构建UI并在代码中使用它们需要的工作量明显减少。感觉就像从Objective-C/IB方式中漏掉了整个步骤,我非常确定这是因为从Objective-C/IB方式中漏掉了整个步骤。到目前为止,虽然我认为还没有进行充分的测试,但MonoTouch是做的最少的工作量的胜者。

  • 你认为学习新语言和平台有趣吗?如果是这样,iPhone会提供很多机会,而且Apple的技术栈可能会让你走出舒适区——对于一些开发者来说,这很有趣味(嗨——我就是其中之一——我开玩笑并抱怨过,但通过Apple的工具学习iPhone开发给我带来了很多乐趣)。

  • 有很多事情要考虑,价值是如此抽象。如果我们谈论成本和是否值得,答案归结为我的第一个要点:如果这是为了商业目的,如果你能得到工作,你将很快收回成本。

    那么......这大概是我能做到的最客观的。这是你可能会问自己的问题的一个简短列表,但这是一个起点。

    个人而言(暂时放下客观性),我喜欢并使用两者。我很高兴我先学习了Apple的技术栈。当我已经熟悉苹果的世界时,使用MonoTouch更容易上手。就像其他人说的那样,你仍然会使用CocoaTouch——只不过是在一个.Net环境中。

    但不仅如此。那些没有使用过MonoTouch的人就会停留在那里——"它只是一个包装器啦啦啦"——那不是MonoTouch。

    MonoTouch提供了访问CocoaTouch所提供的功能以及访问.Net(子集)所提供的功能,使用一些人感觉更加舒适的IDE(我就是其中之一),与Interface Builder更好的集成,虽然你不能完全忘记内存管理,但你会得到一个很好的缓冲区。

    如果你不确定,可以获取Apple的堆栈(免费),并获取MonoTouch评估堆栈(免费)。在加入苹果开发计划之前,两者都只能在模拟器上运行,但这足以帮助你找出你是否远远喜欢其中一个,以及MonoTouch是否对你而言值得399美元。

    不要听信狂热者的话——他们往往是那些没有使用他们反对的技术的人 :)


    50
    哇,Rory,非常感谢你耐心详细地回答我的问题。据我所知,你是唯一一个使用过这两个选项的人,这正是我期望得到答案的来源。我一定会尝试一下这两个选项并根据结果进行选择。顺便说一句,我听了最近的SO播客,你有参与吧?内容不错。再次感谢! - jamesaharvey
    17
    谢谢您的评论 :)我对一些膝-jerk式的仇恨感到失望。问题被反复回答为“你是个白痴,先学会编写操作系统吧,失败者!!?”这是没有帮助且侮辱性的。MonoTouch有其不足之处,但那些人拥有卓越的记录。MT发展迅速,每天变得更加美好。我一直说:再给他们几个月时间。他们在功能上非常谨慎,但我认为我们将看到的东西。我喜欢苹果的堆栈,但我现在有了另一个游乐场-这是一件好事,我很兴奋 :) - Rory Blyth
    4
    @Stephan - 用Cocoa也可以完成工作,不应该说有什么“缺失”,问题在于API。使用 .Net 处理字符串、日期、XML 等内容更加容易。如果你不熟悉 .Net 处理这些内容的方法,以及 MonoTouch 对其的支持程度,建议你去了解一下,只是为了看看。我并不是说 Cocoa 做不到这些事情,但很多事情使用 .Net 更加容易。跨平台解析更容易,日期计算更容易,等等。 - Rory Blyth
    3
    还有一个问题就是在iPhone/iPad上使用MT时您自己的代码重复利用的问题。我们有一些加密代码和业务逻辑代码,在我们的服务器和桌面应用程序上运行,我们可以通过重新编译这些代码并在我们的iOS客户端应用程序中使用MT来实现重复利用。这对于某些项目可能非常重要。 - Monoman
    2
    还值得考虑的是,尽管许可证成本为400美元,但您还必须每年续订一次维护订阅(出于显而易见的原因)- 250美元。这可能是一个公道的价格,但仍然值得考虑。 - Amc_rtty
    显示剩余5条评论

    62

    这篇文章中有许多开发者的传闻,他们从未尝试过MonoTouch 和 Objective-C。似乎大部分是从未尝试过 MonoTouch 的Objective-C开发者。

    显然,我有偏见,但您可以查看 MonoTouch 社区在以下网站上的最新动态:

    http://xamarin.com

    在那里,您将找到一些开发者使用 Objective-C 和 C# 进行开发的文章。


    29
    你有使用过MonoTouch吗?它是一个v1.x版本,几乎是全新的,已经非常出色了。在对它发表评论之前,请先尝试一下。它有大的改变(其Interface Builder集成比Xcode好得多),也有小的改变(例如,比较ObjC/Cocoa获取用户文档文件夹的方式和MT的方式)。我仍然会为某些事情使用苹果的堆栈,但MT很美丽,充满潜力。说真的-试试看。或者看看Cocoa APIs如何被绑定-你不必使用它-只是不要在没有学习它的情况下贬低这项工作。 - Rory Blyth
    是的!此外,与Objective-C相比,一些新的C#5.0功能使编码更加有趣。 - harsimranb

    39

    所以,我对之前一道类似的问题的回答是学习Objective-C。(还有,不要忘记调试支持)

    这可能会冒犯一些人,但说实话,如果你想进行任何严肃的开发,你应该学习Objective-C。在iPhone开发中不了解Objective-C只会成为一个障碍。你将无法理解许多示例;你必须处理Mono的怪癖,而如果你具备Objective-C的工作知识,你可以从平台文档中获得更多的信息。

    就个人而言,我不太明白这种立场,即为了使用Mono而增加所需信息量。对我来说,这似乎有点适得其反。我认为,如果这是一项非常昂贵的提议(学习一门新语言),那么花费一些时间学习基本的编程概念可能是值得的,这样学习新语言就是一件相当便宜的事情。

    另一位用户也写道:


    现在使用Monotouch可能会更容易,但以后会更难。

    例如,当新的种子出现并且由于某些原因破坏了MonoTouch时,会发生什么?

    通过坚持使用Mono,每次查找框架资源时,您都需要将其转换为如何在Mono中使用。您的应用程序二进制文件将变得更大,在几个月后进入Objective-C后,您的开发时间不会快多少,并且其他应用程序开发人员将比您具有更多优势,因为他们正在使用本地平台。

    另一个考虑因素是您希望使用C#,因为您比Objective-C更熟悉该语言。但是iPhone的学习曲线绝大部分不是Objective-C,而是框架-您还必须使用C#调用它们。

    对于任何平台,您应该使用直接表达该平台设计哲学的平台-在iPhone上,这是Objective-C。从反向角度考虑,如果一个习惯于使用GTK编程的Linux开发人员想编写Windows应用程序,您是否会认真建议他们不要使用C#,而要坚持使用GTK,因为这对他们来说更“容易”?



    12
    您可能无意中错误地描述了 MT。它与使用 GTK 编写 Win 应用程序完全不同,根本没有相似之处。MT 的绑定非常忠实于 CocoaTouch,它们实际上改进了一些 CT API 约定。但您并不是在使用基于 Windows Forms 的抽象来编写应用程序。MT 与 MonoDevelop 集成比 Xcode 更好(如果您希望这样),而且您通常可以用一半或更少的代码完成相同的工作。二进制文件大小正在改进,并且工具(绑定生成器等)也越来越好。MT 应用程序就是原生应用程序。 - Rory Blyth
    7
    为了举例说明,而不是期望你仅凭我(显然)亲微软支持者的观点,我可以列出一些事情(这仅仅是优势的一个极小子集):只需一行代码创建属性;无需进行荒谬的数组挖掘即可获取对Document文件夹的引用(应用程序始终在同一位置具有一个docs文件夹 - 为什么要额外工作来“查找”它?);在Cocoa无法胜任的地方使用.NET框架(NSDate,有人吗?);使用通用技能开发企业应用程序;使用适当的、现代的XML位(当Cocoa在字符上默默地卡住并且仅仅停止时我就很喜欢它——没有崩溃——只是停止)。 - Rory Blyth
    8
    不是说我会全部使用它。我喜欢ObjC并继续使用它。而且,如果性能成为问题,我可以更加精细地控制正在发生的事情。但是……有时候MT会更有意义,我认为这将使iPhone成为企业开发的一个可行选项。随便扔个石头就能砸到一个.Net开发者。大多数公司没有内部ObjC开发人员。对于企业工作,他们不应该拥有。MT在处理Web服务和数据库方面要容易得多。您实际上可以使用MT编写许多种类型的应用程序,其代码量只有ObjC的一半。 - Rory Blyth
    8
    最后(我还可以继续说,但我想我已经表达了我的观点),破坏 MonoTouch 的更改可能会像破坏 ObjC 应用程序一样常见。一旦您的应用在商店中上架,它就是一个本地的 iPhone 应用程序(必须如此)。调用最终没有任何区别-与使用苹果堆栈构建的应用程序相同运行时。如果由于运行时环境的更改导致您的 MT 应用程序崩溃,则使用 ObjC 构建的应用程序也将崩溃。而且 MT 团队一直在关注这些问题,快速发布更新和错误修复。MT 的绑定映射足够接近 CT,以至于任何真正的问题的可能性很低。好了-我现在不说话 :) - Rory Blyth

    27

    使用Mono不是一种牵强附会的做法。它为iPhone OS增加了许多功能,例如LINQ、WCF和可在Silverlight应用程序、ASP.NET页面、WPF应用程序、Windows Form应用程序之间共享的代码;同时还有适用于Android的Mono,也将支持Windows Mobile。

    因此,你可以花费大量时间编写Objective-C(从许多研究中可以看出,在C#中编写的完全相同的示例代码比OC少得多),然后将其复制到其他平台上。对我来说,我选择了MonoTouch,因为我正在编写的云应用程序将具有许多界面,而iPhone仅是其中之一。使用WCF从云端数据流传输到MonoTouch应用程序非常简单。我有核心库在各个平台之间共享,然后只需要为iPhone / WinMobile / Android / SilverLight / WPF / ASP.NET部署编写一个简单的表示层。如果要在Objective-C中重新创建所有内容,这将是一场巨大的浪费,无论是在最初的开发阶段还是在产品不断推进的维护阶段,都必须重复而不是重用所有功能。

    那些侮辱MonoTouch或暗示使用它的用户需要支撑的人缺乏关于拥有.NET框架的意义的全局视野,也可能不理解如何以可以在各种平台和设备上重用的方式进行逻辑与表现分离。

    Objective-C很有趣,与许多常见语言非常不同。我喜欢挑战和学习不同的方法...但是如果这样做会妨碍我的进度或创建不必要的重新编码,则不会选择这样做。iPhone SDK框架确实有一些非常棒的功能,但是使用MonoTouch完全支持所有这些优点,减少了手动内存管理、减少了执行相同任务所需的代码量,允许我重用程序集,并使我保持开放的选项,以便能够转移到其他设备和平台。


    19

    我转向使用Monotouch来编写应用程序,可以比使用Objective-C快至少3-4倍(每月写4个应用程序,而以前只能写1个)

    输入量大大减少。

    这只是我的个人经验。


    2
    每月4个应用程序 - 当数量比质量更重要时,MT就像麦当劳。但在XCode-Restaurant,您可以获得更好的食物。 - netshark1000
    2
    结果虽然不同,但Rdio和iCircuit是由Steve Jobs演示的MT应用程序。 C#和MT可以摆脱obj-C强制您执行的管道工作。 - Ian Vink

    17
    如果这是你想开发的唯一iPhone应用程序,而且你对开发Mac应用程序完全没有兴趣,那么MonoTouch可能值得购买成本。
    如果你认为你将来会开发更多的iPhone应用程序,或者想进行一些原生Mac开发,学习Objective-C和相关框架可能值得。此外,如果你是喜欢学习新事物的程序员类型,这是一个有趣的新范式需要研究。

    6
    如果这是你将要开发的唯一的 iPhone 应用程序,那么每年 $99 的费用也不值得。 - Dinah
    您可以使用相同的C#开发工具来构建Mac应用程序。实际上,您可以在iPhone C#和Mac C#应用程序之间共享代码。MonoTouch现在被称为Xamarin。 - Ian Vink

    9
    我个人认为你最好学习Objective-C,这样会更有帮助。
    简而言之:
    - “学习Objective-C”并不像你想象的那么困难,甚至在几周后你可能会发现它很有趣。 - 你已经熟悉了“C风格”的语法,到处都有 *&(){};。 - Apple已经非常好地记录了这些内容。 - 你将以Apple预期的方式与iPhone进行交互,这意味着你将直接从源头获得好处,而不是通过某种过滤器。
    我发现像Unity和MonoTouch这样的项目被认为可以“节省时间”,但最终你仍然需要学习他们特定领域的语言,并且有时需要绕过一些东西。所有这些都可能需要你花费与你试图避免学习的语言相同的时间(按日历时间计算)。最终你没有节省任何时间,并且与某些产品紧密耦合。
    注:我从未意味着对.NET有任何负面影响,事实上我是.NET的忠实拥护者。我的观点是,仅仅因为你还不熟悉奇怪的objc括号符号,就添加更多的复杂性似乎并没有太多意义。
    2019年更新:已经过去了7年。我的观点仍然如此,甚至更加坚定。当然,“特定领域语言”可能是一个错误的术语,但我仍然认为,直接为你正在使用的平台编写代码,并尽可能避免兼容性层和抽象层,这样会更好。如果你担心代码重用和重新工作,一般来说,任何跨平台应用程序需要执行的功能都可以通过现代Web技术实现。

    12
    首先,C# 不是 “特定领域语言” - 远非如此。它是一种通用技能。这是MonoTouch的价值之一。可以(不公平和不准确地)认为ObjC是DSL,因为大多数开发人员(除了金融和大学实验室以及地下室之外)只会将其用于OS X或iPhone开发。但它并不是。与C#一样,它是一种多才多艺的语言,基本上存在的目的是让您专注于框架而不是语言本身(我认为我们在这方面是同意的)。但请记住,您的 ObjC 代码将随着Apple的更新而中断。这不是MT特定的问题。 - Rory Blyth
    3
    在某些情况下,由于有一层抽象,MT甚至可以拯救你。如果苹果修改了一个API?好吧,你的ObjC应用程序和(假装它存在)等价的MT应用程序都会出问题。MT团队可以发布一个临时解决方案,以修改MonoTouch API在幕后处理调用的方式。你的MT代码不需要改变 - 你只需重新构建针对这个临时MT版本。是的:这是一个dirty(不太可靠)的修复方法,可能会很容易地导致问题,但是适当地弃用这个临时MT API将为开发人员提供处理变化的时间,并为真正的修复争取时间。 - Rory Blyth
    4
    虽然 MT 还很新,但现在如果需要的话,创建自己的绑定变得更加容易了(MT 1.2)。你不完全依赖于 MT 的团队来完成所有工作(虽然他们正在做这项工作),以前也不是。他们提供了非常简单的方法来创建绑定。他们在 MT 框架中公开了足够的 ObjC 运行时信息,使您不会被锁定在他们的方式中。我已经重新实现了一些绑定,只是为了看看自己的方式是否更好。如果您愿意,可以忽略 MT 框架并“手动”发送和接收消息,而且所需的代码很少。他们是聪明的人。相信他们 :) - Rory Blyth
    2
    我认为slf并不知道Monotouch只是C#(带有GC),直接绑定到ObjC库+可选的.NET库。因此,您仍然使用由苹果提供的API。但是具有更整洁的语法和垃圾回收功能。 - basarat

    4
    补充其他人已经说过的(好的!):我的感觉是,你基本上是把你需要担心的错误数量翻了一倍,将MonoTouch中的错误添加到已经存在于iPhone OS中的错误中。更新新的操作系统版本甚至比正常情况更加痛苦。总之,这很恶心。
    我唯一能看到的对于MonoTouch的强有力的案例是那些有大量C#程序员和C#代码的组织,他们必须利用iPhone。(这种商店甚至不会对$ 3500眨眼。)
    但对于任何从头开始的人来说,我真的看不出它是否值得或明智。

    “更多的错误”是什么意思?Mono和Objective-C之间存在明显的阻抗不匹配吗? - Jim G.

    4

    三个词:Linq to SQL

    是的,它绝对值得花费。


    4
    使用Objective-C的键值绑定和核心数据(Core Data)可获得类似于Linq-to-SQL的东西。虽然不完全相同,也许没有那么强大,但涵盖了很多相同的领域。 请注意,MonoTouch目前不支持Core-Data。 - philsquared
    Linq to SQL对于iPhone应用程序是否相关?它能与SQLite一起使用吗? - bpapa
    1
    你想让用户在网络上共享数据。你在使用SQL Lite做什么? - Bryan
    MonoTouch基于混合的.NET 2.0和Silverlight 2 API配置文件。 LINQ to objects是否受支持? - Chris S

    2

    虽然已经有一个被接受的答案,但还有一件事我想补充一下 - 谁能说苹果不会拒绝那些带有使用Mono Touch构建迹象的应用程序呢?


    3
    @bpapa - 这是一个完全合理的担忧,但是:1)没有理由拒绝这些应用程序(用户不在意应用程序是用什么编写的-他们只关心应用程序本身),2)MonoTouch 在企业开发方面具有很大的潜力,只要您拥有企业开发者帐户,苹果就无法阻止您分发应用程序。此外,苹果接受使用Unity构建的游戏。最终,MT遵循规则。苹果的流程有时似乎是随机的,但是... MT遵守规则:| - Rory Blyth
    1
    @bpapa - 不知道我为什么错过了这条评论那么长时间,但是:1)许多ObjC应用程序因使用未记录的(“私有的”)API而被“封杀”-如你所指出的FB,但FB仍然活着并可供下载,2)Unity的问题得到了快速解决,Unity再次出现。--至于苹果希望您使用他们自己的东西,我不会反对,但是希望和要求大不相同。至于企业应用程序:您可以部署MT企业应用程序。它们只是本地二进制文件。我不明白问题在哪里,也不明白为什么你这么反对MT。 - Rory Blyth
    @bpapa - 这并没有解释为什么你如此反对机器翻译。我感到困惑的是,有人(比如,就像)会花费这种时间抨击他们不感兴趣且不必使用的产品。没有人告诉你停止使用苹果的工具。仍然使用苹果的工具。我喜欢ObjC,而CocoaTouch考虑到其古老的基础是相当不错的。问题是,虽然我可以说我喜欢ObjC(从经验和在一些相当大的应用程序上的工作中),但我不确定你能否从个人经验谈论MT,这使得你的评论更加令人困惑(和无益)。 - Rory Blyth
    1
    我应该补充一下,我并不是“讨厌”ObjC的语法,而是更喜欢C#。我也更喜欢.Net框架的方式,而不是Cocoa的方式。字符串操作、处理XML、任何涉及日期等方面——我会使用MT CocoaTouch绑定来进行UI工作,但对于大多数其他任务,随MT一起提供的.Net框架子集使生活变得更加轻松。我可以继续说下去(例如我更喜欢在编译时找到某些错误)。我对苹果的堆栈持批评态度,但我并不讨厌它。喜欢MT ObjC /等是可能的。 - Rory Blyth
    1
    苹果公司改变了想法,现在接受任何语言/框架的应用程序,并制定了更加“客观”的接受应用程序的标准清单。 - Monoman
    显示剩余4条评论

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