如何决定MonoTouch和Objective-C?

在今天的一个本地。net活动上,Mono的使用被“提及”为iPhone开发的替代方案。在c#和。net中非常舒适,这似乎是一个有吸引力的选择,尽管Mono堆栈有一些奇怪的地方。然而,由于MonoTouch的售价为400美元,我有些纠结于这是否是iPhone开发的发展方向。

有人用MonoTouch和Objective-C开发过吗?如果是的话,用MonoTouch开发比学习Objective-C更简单、更快,而且值得花400美元吗?

28451 次浏览

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

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

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

这可能会冒犯一些人,但是 如果你要做的话,一定要诚实 认真发展,就要学习 objective - c。不懂Objective-C 在iPhone的开发中会是一个 障碍。你不可能做到 理解许多例子;你必须 处理Mono的怪癖 如果你有工作经验的话 Objective-C可以得到更多

就我个人而言,我不理解 这个位置表示增加 你需要的大量信息 喜欢使用Mono而不是 平台的母语。似乎 对我来说有点适得其反。我 想想这是不是很贵 命题(学习一门新语言) 那么它可能是值得花的 花点时间学习基础编程 观念使学习新 语言是相当便宜的 命题。< / p >

另一个用户也这样写:


现在单触摸对你来说更容易了。但之后就更难了。

例如,当新的种子出现时,你需要测试,但由于某种原因破坏了MonoTouch,会发生什么?

通过坚持使用Mono,任何时候你在寻找框架的资源时,你都必须在心里转换成你将如何在Mono中使用它们。你的应用二进制文件会更大,在使用Objective-C几个月后,你的开发时间不会更快,而其他应用开发者会比你更有优势,因为他们使用的是原生平台。

另一个需要考虑的问题是,您希望使用c#,因为您对该语言比Objective-C更熟悉。但是iPhone学习曲线的绝大部分并不是Objective-C,而是框架——你也必须调用c#。

对于任何平台,你都应该使用直接表达该平台设计理念的平台——在iPhone上,那就是Objective-C。从相反的角度考虑这个问题,如果一个习惯用GTK编程的Linux开发人员想要编写Windows应用程序,你会认真地建议他们不要使用c#而坚持使用GTK,因为这样做对他们来说“更容易”吗?


我个人认为你只学习Objective-C会过得更好。

简而言之:

  • “学习Objective-C”并不像你想象的那样令人生畏,你甚至会在最初几周后就喜欢上它
  • 您已经熟悉了包含大量*&(){};到处都是
  • 苹果在记录方面做得很好
  • 你将以苹果公司预期的方式与iPhone互动,这意味着你将直接从源头获得好处,而不是通过某种过滤。

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

编辑:我从未想过要暗示任何关于。net的负面信息,我只是碰巧是它的忠实粉丝。我的观点是,仅仅因为你还不习惯古怪的objc括号符号,就添加更多的复杂性层,对我来说真的没有多大意义。

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

补充一下其他人已经说过的话(好吧!):我的感觉是你基本上把你需要担心的bug数量增加了一倍,把MonoTouch中的bug添加到iPhone OS中已经存在的bug中。更新新的操作系统版本将比正常情况下更加痛苦。恶心,到处都是。

我所能看到的MonoTouch唯一引人注目的例子是那些有很多很多c#程序员和c#代码的组织,他们在iPhone上利用必须。(就是那种3500美元都不眨眼的商店。)

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

MonoTouch库的成本完全不是重点。你不应该在你的iPhone应用中使用Mono的原因是,它是一种拐杖。如果您懒得学习本机工具,那么我就没有理由相信您的产品值得下载。

编辑:4/14/2010用MonoTouch编写的应用程序不适合iTunes Store。这是应该的。苹果在Mac上看到了大量的浅端口,使用跨平台工具包,如Qt,或Adobe自己的System 7工具箱的部分重新实现,总之,它们不够好。

在这篇文章中有很多来自开发人员的传闻,他们没有尝试过MonoTouch 而且 Objective-C。似乎大多数Objective-C开发者从未尝试过MonoTouch。

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

http://xamarin.com

在那里,你会发现一些开发人员用Objective-C和c#开发的文章。

三个字:Linq to SQL

是的,很值。

使用Mono并不是一种依赖。它为iPhone操作系统增加了很多功能。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编写一个简单的表示层。网络部署。在Objective-C中重新创建它对于初始开发和产品继续向前发展的维护来说都是浪费时间,因为所有功能都必须被复制而不是重用。

那些侮辱MonoTouch或暗示它的用户需要拐杖的人,是缺乏拥有。net框架的大蓝图,可能不理解逻辑与表示的正确分离,这种分离可以在跨平台和设备上重用。

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

我最近经常看到这个问题(以及它的变体)。让我惊讶的是人们的反应如此频繁,但却很少有回答

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

以下是我如何决定MonoTouch的价值-我不能客观,显然,但我认为这是相当狂热的:

  • 这是为了好玩还是为了工作?如果你想从事这方面的咨询工作,你可以很快赚回399美元。

  • 你是想彻底了解这个平台,还是“只是”想为它编写应用程序?

  • 你是否非常喜欢。net,以至于使用不同的开发堆栈会让你失去其中的乐趣?同样,我喜欢两个堆栈(Apple和Mono),但对我来说,MonoTouch使体验更有趣。我并没有停止使用苹果的工具,但这主要是因为我真的很喜欢这两个堆栈。我爱iPhone,也爱。net。在这种情况下,对我来说,MonoTouch是一个显而易见的选择。

  • 你觉得和C一起工作舒服吗?我不是指Objective-C,而是C -它很重要,因为Objective-C C。这是一个漂亮的、花哨的、友好的OO版本,但如果指针让你紧张,MonoTouch是你的朋友。如果你喜欢指针(或C等),不要听那些认为你是开发懦夫的反对者的话。我曾经带着一份IBM ROM BIOS Pocket Reference到处走,当我写程序集,强迫我的电脑进入有趣的视频模式,为它们写我自己的字体渲染位和(无可否认的垃圾)窗口系统时,我不认为QuickBasic开发人员是懦夫。I was a QuickBasic dev(除其余外)。永远不要屈服于书呆子的大男子主义。如果你不喜欢C,如果你不喜欢指针,如果你想尽量远离手动内存管理(而且,公平地说,在ObjC中这一点都不差),那么……MonoTouch。别听那些废话。

  • 你的目标用户是用户还是企业?这对我来说并不重要,但仍然有人在使用Edge,事实是:如果你使用苹果的堆栈,你可以创建一个小得多的下载包。我一直在玩MonoTouch,我有一个不错的小应用程序,一旦压缩,压缩到2.7 MB左右(当你提交应用程序分发时,你压缩它-当应用程序从商店下载时,它们是压缩的-所以当你弄清楚你的应用程序是否会低于10MB的OTA限制时,先压缩它-你会惊喜地发现MonoTouch)。但是,抛开MT的快乐不谈,如果你的目标用户是最终用户,半兆对近3兆(例如)可能对你很重要。如果你考虑的是企业工作,那么几个MB根本不重要。而且,只是为了澄清-我将提交一个基于mt的应用程序到商店很快,我对大小没有任何问题。一点也不困扰我。但如果这是一件与you有关的事情,那么苹果的堆栈就赢了。

  • 做XML工作吗?MonoTouch。时期。

  • 字符串操作吗?日期操作?我们已经习惯了。net的无所不包框架的无数其他小事情?MonoTouch。

  • Web服务?MonoTouch。

  • 从语法上看,它们都有各自的优势。Objective-C更啰嗦你必须写。你会发现自己用c#写代码,而不必用ObjC,但它是双向的。这个特别的话题可以写成一本书。我更喜欢c#语法,但在克服了最初对Objective-C的这种超凡脱俗的反应后,我已经学会了相当享受它。我在演讲中会拿它开玩笑(对于那些习惯了c# /Java等语言的开发者来说,它 很奇怪),但事实是,在我心中有一个Objective-C形状的点让我很开心。

  • 你打算使用接口生成器吗?因为,即使在这个早期版本中,我发现自己用IB构建ui并在代码中使用它们所做的工作要少得多。感觉就像Objective-C/IB做事的方式中缺少了完整的步骤,我很确定这是因为Objective-C/IB做事的方式中缺少了完整的步骤。到目前为止,我不认为我已经充分测试,但到目前为止, MonoTouch是这里的赢家,因为你必须做的工作少了多少。

  • 你认为学习新的语言和平台有趣吗?如果是这样的话,iPhone有很多东西可以提供,苹果的堆栈可能会让你走出你的舒适区——对于一些开发者来说,这是乐趣(嗨,我是其中的一个开发人员-我开玩笑说,给苹果一个艰难的时刻,但我通过苹果的工具学习iPhone开发有很多乐趣)。

要考虑的事情太多了。价值是如此抽象。如果我们谈论的是成本和是否值得,答案就归结为我的第一个项目:如果这是为了生意,如果你能得到这份工作,你就能赚回你的钱。

所以…这是我最客观的评价了。这是一个你可能会问自己的问题的简短清单,但这只是一个起点。

就我个人而言(让我们暂时放弃客观性),我喜欢并使用这两种方法。我很高兴我先学会了苹果堆栈。当我已经熟悉苹果的世界时,使用MonoTouch会更容易上手。正如其他人所说,你仍然要使用CocoaTouch——它只是将在一个。net化的环境中。

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

MonoTouch让你访问CocoaTouch所提供的功能,同时也让你访问。net所提供的(一个子集),一个一些人觉得更舒服的IDE(我是其中之一),更好地与Interface Builder集成,尽管你不能完全忘记内存管理,但你得到了一个很好的余地。

如果你不确定,抓取苹果的堆栈(它是免费的),抓取MonoTouch的eval堆栈(它是免费的)。在你加入苹果的开发程序之前,这两种软件都只能在模拟器上运行,但这足以帮助你弄清楚你是否更喜欢其中一种,以及MonoTouch对你来说是否值得花399美元。

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

我想补充一点,即使有一个公认的答案——谁能说苹果不会拒绝那些有迹象表明是用Mono Touch构建的应用呢?

我换了。Monotouch让我编写应用程序的速度至少提高了3-4倍(与我以前在Obj C中每月1个应用程序相比,每月4个)

打字少了很多。

只是我的经验。

我会花时间在Objective-C上,主要是因为你可以从这样的网站上得到帮助。Objective-C的优点之一是你可以使用C和c++代码,而且有很多项目都是好测试

另一件事是你的代码(语言选择)将被苹果支持。什么是ios5。例如,x删除了对第三方解决方案如MonoTouch?你会怎么告诉你的客户?

如果你还没有完全准备好转向Objective-C,也许使用HTML5等独立于平台的解决方案会更好?

我已经使用MonoTouch几个月了,我从ObjectiveC移植了我的半成品应用,这样我就可以在未来的某个时候支持Android。

以下是我的经验:

不好的地方在于:

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

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

  • MonoTouch问题。我曾经经历过由事件处理引起的内存泄漏问题,并且不得不加入一些非常糟糕的解决方法来防止泄漏,例如在进入和离开视图时附加和分离事件。Xamarin开发人员正在积极研究这类问题。

  • 第三方库。我花了相当多的时间转换/绑定Objective - c库,以便在我的应用程序中使用,尽管这在Objective Sharpie等自动化软件的帮助下变得更好。

  • 更大的二进制文件。这并不困扰我,但我想我应该提一下。在我看来,现在多出几Mb根本不算什么。

好的方面:

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

  • . net。在c# . net中工作比在Objective C中工作要好得多。

  • MonoTouch。iOS中几乎所有的东西都映射到。net中,让事情正常工作是相当直接的。

  • Xamarin的。你可以看到这些人真的在努力改进一切,使开发更顺畅和更容易。

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

如果你只是在创造一款在其他平台上永远都不需要的iPhone应用,并且你是一名独立开发者,那么我现在会坚持使用XCode和Objective C。

作为一个同时拥有c#和Objective-C经验的人,我想说对于大多数人来说Xamarin是物有所值的。

c#是一门设计得很好的语言,c# API也是设计得很好的。当然Cocoa Touch的API(包括UIKit)也有很好的设计,但是语言可以在几个方面得到改进。当你用c#写代码时,你可能会比用Objective-C写相同的代码更有效率。这是由于几个原因,但其中一些原因是:

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