如何决定MonoTouch和Objective-C?

Mono在当地的.Net活动上今天坐在一个会议上,MonoTouch的使用被作为iPhone开发的替代品。 在C#和.Net中使用起来非常舒服,尽pipeMono堆栈有些诡异,但它似乎是一个吸引人的select。 但是,由于MonoTouch的价格是400美元,所以如果这是iPhone开发的方式,我还是有点受挫。

任何人都有使用MonoTouch和Objective-C进行开发的经验,如果是使用MonoTouch进行开发,比学习Objective-C更简单,更快速,而且价值400美元?

我最近看到了这个问题(以及它的变化)。 令我惊奇的是人们经常回答,但答案却很less。

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

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

  • 这是为了娱乐还是业务? 如果你想在这个领域进行咨询,你可以很快就回到399美元。

  • 你想从内部学习这个平台吗,还是你只是想为它编写应用程序呢?

  • 你喜欢.Net足够的,使用不同的开发堆栈会为你带来乐趣吗? 再次,我喜欢这两个堆栈(苹果和单声道),但对我来说,MonoTouch使得体验更加有趣。 我还没有停止使用苹果的工具,但主要是因为我真的喜欢这两个堆栈 。 我喜欢iPhone,而且我喜欢.Net。 在那种情况下,对于我来说,MonoTouch是一个不容易的事情。

  • 你觉得与C合作感觉舒服吗? 我不是指Objective-C,而是C – 它很重要,因为Objective-C C.这是一个很好的,看上去很友好的OO版本,但是如果指针给你heebie-jeebies,那么MonoTouch就是你的朋友。 如果碰巧你喜欢指针(或C等),就不要听那些认为你是开发者的反对者。 我曾经用IBM ROM BIOS Pocket Reference的副本走路,当我编写程序集并强制我的计算机进入有趣的video模式,并为他们编写我自己的字体渲染位(无可厚非的)窗口系统时,不要以为QuickBasic开发者是wusses。 我一个QuickBasic开发(除了其他)。 永远不要屈服于书呆子大男子主义。 如果你不喜欢C,如果你不喜欢指针,并且希望尽可能地远离手动内存pipe理(而且公平地说,在ObjC中它一点都不差)。 MonoTouch。 不要为此付出任何代价。

  • 您想要定位用户还是企业? 对我来说没什么关系,但Edge上仍然有人,事实是:如果你使用苹果的堆栈,你可以创build一个更小的下载包。 我一直在玩MonoTouch,我有一个体面的小应用程序,一旦压缩,下降到大约2.7 MB(当提交您的应用程序分发,你压缩 – 当应用程序从商店下载,他们'重新压缩 – 所以当搞清楚你的​​应用程序将在10MB OTA限制下进来时,首先将压缩文件压缩 – 你将会对MonoTouch感到惊喜)。 但是,除了MT快乐之外,如果你的目标是最终用户,那么对于将近三个(例如)半米就是对你来说可能是重要的。 如果你在考虑企业的工作,几MB根本就不重要。 而且,为了清楚起见,我将很快向商店提交一个基于MT的应用程序,而且我对这个尺寸没有任何问题。 根本不打扰我。 但是,如果这是所关心的事情,那么苹果的筹码就会赢得这个奖项。

  • 做任何XML工作? MonoTouch的。 期。

  • string操作? date操作? 我们已经习惯了一百万个其他的小东西.Net的一切 – 厨房水槽架构? MonoTouch的。

  • 网页服务? MonoTouch的。

  • 在句法上,它们都有其优点。 Objective-C往往是更详细的地方,你必须写它 。 你会发现自己用C#编写代码,你不需要用ObjC编写代码,但是它是双向的。 这个特定的主题可以填写一本书。 我更喜欢C#的语法,但是在完成了我对Objective-C的这种非现实的反应后,我学会了很多。 我在谈话中取笑了一下(对于习惯于C#/ Java /等的开发者来说,这奇怪),但事实是我的心中有一个Objective-C的形状,让我感到开心。

  • 你打算使用Interface Builder吗? 因为,即使在这个早期的版本中,我发现自己做了很less的工作来用IB构build我的UI,然后在代码中使用它们。 感觉像Objective-C / IB的做事方式中没有完整的步骤,我敢肯定这是因为Objective-C / IB的做事方式中没有完整的步骤。 到目前为止,我不认为我已经进行了足够的testing,但到目前为止 ,MonoTouch在这方面是胜利者,因为您需要做的工作量less得多。

  • 你认为学习新的语言和平台很有趣吗? 如果是这样,iPhone有很多东西可以提供,苹果的堆栈可能会让你走出你的舒适区 – 对于一些开发者来说,这很有趣 (嗨 – 我是其中一个开发者 – 我开玩笑说,苹果公司很辛苦,但是通过苹果公司的工具学习iPhone开发的过程非常有趣)。

有太多的事情要考虑。 价值是如此抽象。 如果我们谈论成本,是否值得,那么答案就归结为我的第一个项目:如果这是为了生意,如果能够得到这份工作,那么就可以让你的钱恢复正常。

所以……这跟我一样客观。 这是您可能会问自己的一个简短清单,但这是一个起点。

个人(让我们暂时放弃客观),我喜欢和使用两者。 我很高兴我先学习了苹果电脑。 当我已经知道了苹果的世界之路的时候,用MonoTouch启动和运行起来就更容易了。 正如其他人所说,你仍然将与CocoaTouch合作 – 这只是在一个.Net化的环境中。

但还有更多。 没有使用过MonoTouch的人往往会停在那里 – “这是一个包装等等等等 – ”这不是MonoTouch。

MonoTouch使您可以访问CocoaTouch提供的function,同时还可以访问.Net所提供的function(IDE的一个子集),一些IDE让人感觉更舒适(我是其中之一),与Interface Builder更好的集成,虽然你不能完全忘记memory management,但你会获得很好的回旋余地。

如果你不确定,抓住苹果的堆栈(它是免费的),并抓住MonoTouch eval堆栈(它是免费的)。 直到你join苹果的开发计划,两者都只会对模拟器运行,但这足以帮助你弄清楚你是否更喜欢另一个,而且对于你来说,MonoTouch是否值得399美元。

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

在这篇文章中,有许多还没有尝试过MonoTouch Objective-C的开发者的传言。 它似乎主要是从未尝试过MonoTouch的Objective-C开发人员。

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

http://xamarin.com

在那里你会发现几个开发人员在Objective-C和C#中开发的文章。

所以,我以前类似的问题的答案是学习Objective-C。 (另外,不要忘记debugging支持)

这可能会冒犯一些,但说实话,如果你要做任何认真的发展,你应该学习Objective-C。 在iPhone开发中不知道Objective-C只是一个障碍。 你将无法理解很多例子。 你必须处理Mono的怪癖,而如果你有Objective-C的工作知识,你可以从平台文档中获得更多的东西。

就我个人而言,我不明白这样一种立场,即增加您需要的信息量,以便在平台的本地语言中使用Mono。 这对我来说似乎有些反作用。 我认为,如果这是一个非常昂贵的命题(学习一种新的语言),那么在基本的编程概念上花费一些时间是值得的,因此学习新的语言是一个相当便宜的命题。

另一位用户也写道:


Monotouch现在对你来说比较容易。 但后来更难。

例如,当新的种子出来,你需要testing,但打破了MonoTouch出于某种原因会发生什么?

通过坚持单声道,任何时候你正在寻找框架的资源,你必须精神转变成你将如何使用它们与单声道。 您的应用程序二进制文件将会更大,开发时间在进入Objective-C几个月之后速度不会那么快,而其他应用程序开发人员因为使用本机平台而比您拥有更多的优势。

另一个考虑是你正在寻找使用C#,因为你比Objective-C更熟悉语言。 但是,绝大多数iPhone的学习曲线不是Objective-C,它是框架 – 您将不得不与C#一起调用。

对于任何平台,您都应该使用直接expression该平台devise理念的平台 – 在iPhone上,即Objective-C。 从相反的angular度考虑一下,如果一个习惯了GTK编程的Linux开发人员想要编写Windows应用程序,你会不会认真地推荐他们不使用C#,而是坚持使用GTK,因为他们这样做比较容易?


使用单声道不是一个拐杖。 有很多事情,它增加了iPhone操作系统。 LINQ,WCF,Silverlight应用程序,ASP.NET页面,WPF应用程序,Windows窗体应用程序之间的可共享代码,还有Android的单声道,它也适用于Windows Mobile。

所以,你可以花一大笔时间来编写Objective-C(你会从许多研究中看到,C#中完全相同的示例代码比OC写的要less很多),然后将其全部重复用于其他平台。 对于我来说,我select了MonoTouch,因为我正在写的云端应用程序将有很多接口,iPhone只是其中之一。 将WCF数据从云端传输到MonoTouch应用程序非常简单。 我有各种平台共享的核心库,只需要为iPhone / WinMobile / Android / SilverLight / WPF / ASP.NET部署编写一个简单的表示层即可。 在Objective-C中重新创build所有的function将会极大地浪费时间,因为所有function都必须被复制而不是被重用,因为产品不断向前发展。

那些侮辱MonoTouch或者暗示其用户需要一个拐杖的人们缺乏将.NET框架触手可得的大概意思,也许不能理解逻辑和呈现方式的合理分离。可以跨平台和设备重复使用。

Objective-C与许多常见语言有趣且非常不同。 我喜欢挑战,学习不同的方法……但是这样做不但妨碍了我的进步,也造成了不必要的重新编码。 关于iPhone SDK框架有一些非常棒的东西,但是MonoTouch完全支持所有这些伟大的事物,并且削减了所有的手动内存pipe理,减less了执行相同任务所需的代码量,允许我重新使用我的程序集,保持我的select开放,以便能够移动到其他设备和平台。

我转了。 Monotouch让我的应用程序速度至less提高3-4倍(每个月的应用程序数量为4个,与Obj C的每月1个应用程序相比)

很less打字。

只是我的经验。

如果这是您将要开发的唯一的iPhone应用程序,而且您对开发Mac应用程序也毫无兴趣,那么MonoTouch可能是值得的。

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

就个人而言,我认为只要学习Objective-C,你会有更好的时间。

简而言之:

  • “学习目标C”并不是一个令人畏惧的想法,甚至可能在刚开始的几个星期之后就可以享受
  • 你已经熟悉了很多*&(){}的“C风格”语法。 到处
  • 苹果公司做了很好的文件logging工作
  • 您将以苹果公司的方式与iPhone进行交互,这意味着您将直接从源代码获得好处,而不是通过某些filter。

我发现像Unity和MonoTouch这样的项目应该“节省你的时间”,但是最终你还是需要学习他们特定于领域的语言,并且有时候必须采取措施。 所有这一切可能只会让你学习你想避免学习的语言(在日历时间)。 最后你没有节省时间,而且你和某些产品紧密相连。

编辑:我从来没有打算暗示任何负面的.NET我碰巧是一个很大的粉丝。 我的观点是,仅仅因为你对古怪的objc括号不熟悉而增加更多的复杂层次对我来说并没有什么意义。

添加到其他人已经说过的(好!):我的感觉是,基本上你必须担心的错误数量加倍,将MonoTouch中的错误添加到已经在iPhone OS中的错误中。 更新新的操作系统版本将比平常更加痛苦。 Yuck,四周。

我能看到的MonoTouch唯一引人注目的例子是那些拥有大量C#程序员和C#代码的组织,他们必须在iPhone上利用这些代码。 (这种商店甚至不会眨眼3500美元。)

但是对于从头开始的人来说,我真的不能认为这是值得的或明智的。

三个字:Linq to SQL

是的,这是值得的$。

我想补充一点,即使有一个可以接受的答案 – 谁能说苹果公司不会拒绝那些有Mono Touch技术的应用程序呢?

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

另一件事是你的代码(首选语言)将被苹果支持。 例如,它的iOS 5.x取消了对像MonoTouch这样的第三方解决scheme的支持? 那么你会告诉你的客户?

如果您还没有完全准备好移植到Objective-C,也许最好使用像HTML5这样的独立于平台的解决scheme?

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

这是我的经验:

坏点:

  • Xamarin工作室。 像我这样的独立开发者被迫使用Xamarin Studio。 它每周都在好起来,开发者们在论坛上发现和修复bug非常活跃,但是它还是很慢,经常挂起,有很多bug,debugging也很慢。

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

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

  • 第三方库。 我花了相当一段时间转换/绑定ObjectiveC库在我的应用程序中使用,虽然这与自动化软件,如客观Sharpie越来越好。

  • 较大的二进制文件。 这并不是真的打扰我,但我想我会提到它。 国际海事组织几个额外的Mb是没有这些天。

好位:

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

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

  • MonoTouch的。 在iOS中,几乎所有的东西都被镜像在.Net中,并且让事情起作用是相当直接的。

  • Xamarin。 你可以看到,这些人正在努力改善一切,使发展更顺畅,更容易。

我绝对推荐Xamarin进行跨平台开发,尤其是如果您有资金使用与Visual Studio一起使用的Business或Enterprise版本。

如果你只是创build一个在另一个平台上永远不需要的iPhone应用程序,并且你是一个独立开发者,那么现在就坚持使用XCode和Objective C。

作为有C#和Objective-C经验的人,对于大多数人来说,Xamarin会非常值得。

C#是一个非常好的devise语言,C#API也是很好的devise。 当然,cocoa触摸API(包括UIKit)也有很好的devise,但是语言可以通过几种方式进行改进。 在C#中编写代码时,与在Objective-C中编写相同的代码相比,您可能会更有成效。 这是由于几个原因,但一些原因是:

  • C#有types推断 。 types推断使编写代码更快,因为您不必“知道”作业左侧的types。 这也使得重构更容易,更节省。

  • C#具有generics ,与相当的Objective-C代码相比,这将减less错误(尽pipe在Objective-C中有一些解决方法,在大多数情况下开发人员将避免它们)。

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

  • 您将能够重新使用iOS,Android和Windows Phone上的部分代码。

  • MonoTouch很大程度上直接实现了CocoaTouch API。 例如:如果你有CocoaTouch的经验,你会知道在哪里找MonoTouch中的控件类(MonoTouch.UIKit包含UIButton,UIView,UINavigationController等的类,同样,MonoTouch.Foundation获得了NSString的类, NSData等)。

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

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

MonoTouch库的成本完全在旁边。 你不应该为你的iPhone应用程序使用Mono的原因是它是一个拐杖。 如果你不习惯学习本地工具,那么我没有理由相信你的产品值得下载。

编辑:2010年4月14日使用MonoTouch编写的应用程序不适用于iTunes Store。 这是应该的。 苹果公司在Mac上看到了很多浅的端口,使用了像Qt这样的跨平台工具包,或者Adobe自己部分重新实现了System 7工具箱,而且它们的长短不够。