273

今天在当地的 .Net 活动中参加了有关 Mono 的会议后,MonoTouch 的使用被“触及”为 iPhone 开发的替代方案。在 C# 和 .Net 中非常舒服,这似乎是一个吸引人的选择,尽管 Mono 堆栈有些古怪。然而,由于 MonoTouch 的价格为 400 美元,我有点担心这是否是 iPhone 开发的方式。

任何人都有过使用 MonoTouch 和 Objective-C 开发的经验,如果有的话,使用 MonoTouch 进​​行开发是否比学习 Objective-C 更简单、更快捷,并且值 400 美元?

4

14 回答 14

520

我最近经常看到这个问题(及其变体)。令我惊讶的是,人们回复的频率很高,但回复的次数却很少

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

下面是我如何确定 MonoTouch 的价值 - 显然,我不能客观,但我认为这是非常狂热的:

  • 这是娱乐还是商务?如果你想进入这个领域的咨询,你可以很快赚回 399 美元。

  • 你想从内到外学习这个平台,还是“只是”想为它编写应用程序?

  • 您是否足够喜欢 .Net,以至于使用不同的开发堆栈会为您带来乐趣?同样,我喜欢这两种堆栈(Apple 和 Mono),但对我来说,MonoTouch 让体验变得更加有趣。我并没有停止使用 Apple 的工具,但这主要是因为我真的很喜欢这两种堆栈。我喜欢 iPhone,也喜欢 .Net。在那种情况下,对我来说,MonoTouch 是轻而易举的事。

  • 你觉得和 C 一起工作很舒服吗?我指的不是 Objective-C,而是 C——这很重要,因为 Objective-CC。它是一个不错的、花哨的、友好的 OO 版本,但是如果指针给你带来了 heebie-jeebies,那么 MonoTouch 就是你的朋友。如果碰巧您喜欢指针(或 C 等),请不要听那些认为您是开发者的反对者。我过去常常带着一份 IBM ROM BIOS Pocket Reference 的副本四处走动,当我编写程序集并迫使我的计算机进入有趣的视频模式并为它们和(诚然垃圾)窗口系统编写我自己的字体渲染位时,我没有不要认为 QuickBasic 的开发者是坏蛋。我一个 QuickBasic 开发人员(除了其余的)。永远不要屈服于书呆子的男子气概。如果你不喜欢 C,如果你不喜欢指针,如果你想尽可能远离手动内存管理(而且,公平地说,在 ObjC 中一点也不差),那么。 .. 单触。并且不要为此胡说八道。

  • 您想定位用户或企业吗?这对我来说无关紧要,但仍然有人使用 Edge,而事实是:如果您使用 Apple 的堆栈,您可以创建一个更小的下载包。我一直在玩 MonoTouch,我有一个不错的小应用程序,一旦压缩,它会降到大约 2.7 MB(提交你的应用程序进行分发时,你压缩它 - 当应用程序从商店下载时,他们'重新压缩 - 因此,当确定您的应用程序是否会低于 10MB OTA 限制时,请先压缩傻瓜 - MonoTouch 会让您感到惊喜)。但是,除了 MT 快乐之外,如果您的目标是最终用户,那么半兆与近 3(例如)对您来说可能很重要。如果您正在考虑企业工作,那么几 MB 根本无关紧要。和,需要明确的是——我很快就会向商店提交一个基于 MT 的应用程序,而且我对大小没有任何问题。根本不打扰我。但如果这是值得关注的事情,那么 Apple 的堆栈赢了这个。

  • 做任何 XML 工作?单触。时期。

  • 字符串操作?日期操纵?我们已经习惯使用 .Net 的一切和厨房水槽框架的其他一百万个小东西?单触。

  • 网页服务?单触。

  • 从语法上讲,它们都有各自的优势。Objective-C在你必须写它的地方往往更冗长。您会发现自己使用 C# 编写代码,而不必使用 ObjC 编写,但它是双向的。这个特定的主题可以写满一本书。我更喜欢 C# 语法,但在克服了我最初对 Objective-C 的“这是超凡脱俗”的反应之后,我学会了享受它。我在谈话中取笑它(这对于习惯于 C#/Java/等的开发人员来说奇怪),但事实是我心里有一个 Objective-C 形状的点让我很开心。

  • 你打算使用界面生成器吗?因为,即使在这个早期版本中,我发现自己用 IB 构建 UI 并在代码中使用它们的工作要少得多。感觉就像 Objective-C/IB 的做事方式缺少整个步骤,我很确定这是因为 Objective-C/IB 的做事方式缺少整个步骤。到目前为止,我认为我还没有进行充分的测试,但是到目前为止,MonoTouch 是赢家,因为您需要做的工作少得多。

  • 你认为学习新的语言和平台很有趣吗?如果是这样,iPhone 有很多东西可以提供,Apple 的堆栈可能会让你走出舒适区——这对一些开发者来说很有趣(嗨——我是其中的开发者之一——我开玩笑说Apple 经历了一段艰难时期,但我通过 Apple 的工具学习 iPhone 开发获得了很多乐趣)。

有很多事情要考虑。价值是如此抽象。如果我们谈论成本以及它是否值得,答案归结为我的第一个项目符号:如果这是为了商业,并且如果你能得到工作,你会马上赚回你的钱。

所以……这就是我所能做到的客观。这是您可能会问自己的简短列表,但这是一个起点。

就个人而言(让我们暂时放弃客观性),我喜欢并使用两者。我很高兴我首先了解了 Apple 堆栈。当我已经熟悉 Apple 的世界时,我更容易开始使用 MonoTouch。正如其他人所说,您仍将使用 CocoaTouch——它只是在一个 .Net 化的环境中。

但不止于此。没有使用过 MonoTouch 的人往往会停在那里——“这是一个包装器等等等等”——那不是 MonoTouch。

MonoTouch 让您可以访问 CocoaTouch 必须提供的功能,同时还可以让您访问 .Net 必须提供的(一个子集),一些人觉得更舒服的 IDE(我是其中之一),与 Interface Builder 更好的集成,虽然你不会完全忘记内存管理,但你有很大的余地。

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

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

于 2009-10-28T00:51:08.270 回答
62

这篇文章中有很多来自没有尝试过 MonoTouchObjective-C 的开发人员的传闻。似乎大多数是从未尝试过 MonoTouch 的 Objective-C 开发人员。

我显然有偏见,但你可以看看 MonoTouch 社区在做什么:

http://xamarin.com

在那里,您将找到几篇来自使用 Objective-C 和 C# 开发的开发人员的文章。

于 2009-10-19T15:46:19.353 回答
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,因为这样做对他们来说“更容易”吗?


于 2009-10-18T02:57:18.970 回答
27

使用 Mono 不是拐杖。它为 iPhone OS 添加了很多东西。LINQ、WCF、Silverlight 应用程序、ASP.NET 页面、WPF 应用程序、Windows 窗体应用程序之间的可共享代码,还有适用于 Android 的单声道,它也适用于 Windows Mobile。

因此,您可以花大量时间编写 Objective-C(您会从许多研究中看到,在 C# 中完全相同的示例代码比 OC 编写的代码要少得多),然后将其全部复制到其他平台。对我来说,我选择了 MonoTouch,因为我正在编写的 Cloud App 会有很多界面,iPhone 只是其中之一。将 WCF 数据从云端流式传输到 MonoTouch 应用程序非常简单。我有在各种平台之间共享的核心库,然后只需要为 iPhone/WinMobile/Android/SilverLight/WPF/ASP.NET 部署编写一个简单的表示层。随着产品继续向前发展,因为所有功能都必须被复制而不是重用,所以在 Objective-C 中重新创建这一切对于初始开发和维护来说都是一种巨大的时间浪费。

侮辱 MonoTouch 或暗示它的用户需要拐杖的人缺乏对触手可及的 .NET 框架意味着什么的大图景,并且可能不理解逻辑与演示的正确分离方式可以跨平台和设备重复使用。

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

于 2009-10-23T18:53:07.587 回答
19

我换了。Monotouch 让我编写应用程序的速度至少快了 3-4 倍(每月 4 个应用程序,而我在 Obj C 中每月只有 1 个)

打字少了很多。

只是我的经验。

于 2010-02-06T20:15:16.103 回答
17

如果这是您将开发的唯一 iPhone 应用程序,并且您对开发 Mac 应用程序的兴趣也为零,那么 MonoTouch 可能是物有所值的。

如果你认为你会开发更多的 iPhone 应用程序,或者想做一些 Mac 原生开发,那么学习 Objective-C 和相关框架可能是值得的。另外,如果你是那种喜欢学习新事物的程序员,那么这是一个有趣的学习新范式。

于 2009-10-18T02:56:54.857 回答
9

就我个人而言,我认为学习 Objective-C 会更好。

简而言之:

  • “学习Objective-C”并不像您想象的那样令人生畏,您甚至可能会在最初的几周后享受它
  • 您已经熟悉了带有大量 *&(){}; 的“C 风格”语法;到处
  • 苹果在记录事物方面做得非常好
  • 您将按照 Apple 预期的方式与 iPhone 进行交互,这意味着您将直接从源头获得好处,而不是通过某些过滤器。

我发现像 Unity 和 MonoTouch 这样的项目应该“节省你的时间”,但最终你还是需要学习他们的领域特定语言,并且有时不得不回避一些事情。所有这一切可能会让你花尽可能长的时间来学习你试图避免学习的语言(在日历时间内)。最后,您没有节省任何时间,并且您与某些产品紧密耦合。

编辑:我从来没有暗示任何关于 .NET 的负面信息,我碰巧是它的忠实粉丝。我的观点是,仅仅因为你还不习惯古怪的 objc 括号表示法而增加更多的复杂性对我来说并没有多大意义。

2019 年更新:7 年后。如果不是更多的话,我仍然有同样的感觉。当然,“领域特定语言”可能是一个错误的术语,但我仍然相信直接为您正在使用的平台编写并尽可能避免兼容层和抽象会更好。如果您担心代码重用和返工,一般来说,您的跨平台应用程序需要执行的任何功能都可以通过现代 Web 技术来完成。

于 2009-10-18T03:06:15.317 回答
4

补充一下其他人已经说过的话(好吧!):我的感觉是,您基本上需要担心的错误数量增加了一倍,将 MonoTouch 中的错误添加到 iPhone OS 中已有的错误。更新新的操作系统版本将比平时更痛苦。呸,到处都是。

对于 MonoTouch,我能看到的唯一令人信服的案例是拥有大量 C# 程序员和 C# 代码的组织,他们必须在 iPhone 上利用这些代码。(那种连 3500 美元都不会眨眼的商店。)

但对于任何从零开始的人来说,我真的看不出这是值得或明智的。

于 2009-10-18T03:26:11.667 回答
4

三个字:Linq to SQL

是的,这很值得。

于 2009-10-21T21:05:50.383 回答
2

我想补充一点,即使有一个公认的答案 - 谁说 Apple 不会拒绝那些有使用 Mono Touch 构建的迹象的应用程序?

于 2009-11-13T18:31:59.307 回答
2

我会把时间花在 Objective-C 上,主要是因为你可以从这样的网站获得所有帮助。Objective-C 的优势之一是您可以使用 C 和 C++ 代码,并且那里有很多经过良好测试的项目。

另一件事是你的代码(选择的语言)将得到苹果的支持。例如,iOS 5.x 取消了对 MonoTouch 等第三方解决方案的支持是什么?那你会告诉你的客户什么?

如果您还没有完全准备好迁移到 Objective-C,那么使用像 HTML5 这样的平台独立解决方案可能会更好?

于 2011-02-08T19:43:09.677 回答
2

我已经使用 MonoTouch 几个月了,我从 ObjectiveC 移植了我的半成品应用程序,因此我可以在将来的某个时候支持 Android。

这是我的经验:

坏位:

  • Xamarin 工作室。像我这样的独立开发者被迫使用 Xamarin Studio。每周都在变好,开发人员在论坛上非常积极地识别和修复错误,但仍然很慢,经常挂起,有很多错误,调试也很慢。

  • 建造时间。构建我的大型(链接)应用程序以在设备上进行调试可能需要几分钟,这与几乎立即部署的 XCode 相比。为模拟器构建(非链接)要快一些。

  • MonoTouch 问题。我遇到了由事件处理引起的内存泄漏问题,并且不得不采取一些非常丑陋的解决方法来防止泄漏,例如在进入和离开视图时附加和分离事件。Xamarin 开发人员正在积极研究此类问题。

  • 第 3 方库。我花了很多时间转换/绑定 ObjectiveC 库以在我的应用程序中使用,尽管使用诸如 Objective Sharpie 之类的自动化软件会变得更好。

  • 更大的二进制文件。这并没有真正困扰我,但我想我会提到它。这些天,IMO 额外的 Mb 不算什么。

好位:

  • 多平台。我的朋友很高兴地从我的核心代码库创建了我的应用程序的 Android 版本,我们正在并行开发,并且正在提交到 Dropbox 上的远程 Git 存储库,进展顺利。

  • 。网。在 C# .Net 中工作比 Objective C IMO 好得多。

  • 单触。iOS 中的几乎所有内容都反映在 .Net 中,并且让事情正常运行非常简单。

  • 赛马林。你可以看到这些家伙真的在努力改进一切,使开发更顺畅、更容易。

我绝对推荐 Xamarin 进行跨平台开发,特别是如果你有钱使用与 Visual Studio 一起工作的商业版或企业版。

如果您只是在创建一个在其他平台上永远不需要的 iPhone 应用程序,并且您是一名独立开发人员,那么我现在会坚持使用 XCode 和 Objective C。

于 2013-08-12T10:46:58.873 回答
1

作为具有 C# 和 Objective-C 经验的人,我想说对于大多数人来说,Xamarin 物有所值。

C# 是一种非常好的设计语言,C# API 的设计也很好。当然 Cocoa Touch API(包括 UIKit)也有很棒的设计,但是该语言可以通过多种方式进行改进。与在 Objective-C 中编写相同的代码相比,使用 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 等...)。

  • 与 PhoneGap 或 Titanium 等解决方案不同,Xamarin 将为用户提供原生体验。

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

于 2013-12-06T22:03:23.300 回答
-35

MonoTouch 库的成本完全无关紧要。你不应该在你的 iPhone 应用程序中使用 Mono 的原因是它是一个拐杖。如果你懒得学习原生工具,那我没有理由相信你的产品值得下载。

编辑:2010 年 4 月 14 日使用 MonoTouch 编写的应用程序不符合 iTunes Store 的条件。这是应该的。Apple 在 Mac 上看到了很多浅端口,使用 Qt 等跨平台工具包,或者 Adob​​e 自己对 System 7 工具箱的部分重新实现,总而言之,它们还不够好。

于 2009-10-19T09:46:09.050 回答