這是我在知乎上的一個回答,原文在這裡:http://www.zhihu.com/question/20001972/answer/15572624
我沒有用XCode開發過具體項目,我的移動開發經驗主要是Android SDK、AIR for Android、AIR for iOS。
因為開發經驗的限制,我不能準確的說明XCode的優勢和劣勢,這裡只基於自己的Android開發經驗,以及AIR在iOS上的開發經驗來分析。
AIR的優勢
AIR的優勢其實就是Flash或者ActionScript語言的優勢。這些優勢大家已經在互連網上看過許多了,我還是囉嗦一下:
1. 優秀的2D效能和渲染機制
網路上關於Flash效能底下的言論是絕對錯誤的。其實Flash的效能相當高,而且大多數情況下都比Javascript高。ActionScript經過如此長時間的專制發展,形成了一套便於使用的顯示列表(DisplayObject)機制,加上靈活的MovieClip和Sprite等等對象,在製作2D動畫方面,是目前互連網技術中最好的選擇。即使是你認為顯示列表的效能底下(在顯示對象超過1K的情況下確實低下),你也完全可以使用BitmapData這個高效能的引擎做位元影像渲染。
2. 蓬勃發展的3D技術
Stage3D比OpenGL要更容易掌握。使用各種開源、付費的引擎,程式員可能不需要瞭解3D工作機制,就能製作3D動畫(或者遊戲)。當然,目前的Stage3D的驅動支援還有待完善,但Adobe目前很努力(不努力就掛掉了),驅動情況會慢慢解決掉。
更讓人激動的是Starling這類使用Stage3D進行2D渲染的引擎。完全為遊戲而生,把Flash的2D效能又提高了一個數量級。
3. 比較完善的架構和社區
Flash社區經過多年發展,已經非常完善,有很多的優秀的架構、工具、引擎、調試器、甚至編譯器可以使用。當然,OC社區或許更完善,所以這個有優勢並不明顯。
4. 簡單易用的語言
ActionScript是簡化版的JAVA。我無法把ActionScript與OC對比,但ActionScript絕對比JAVA易用。相關比較可以看這個:http://www.zhihu.com/question/19762068/answer/15544195
5. 使用ANE可以完成所有OC能做的事情
AIR使用的ANE外掛程式技術,讓你用OC開發一些本機外掛程式,以API的方式來調用它,讓你能完成AIR本不能完成的事情。後面我會提到,其實這個也算劣勢。
AIR的劣勢
1. 大檔案
AIR在iOS上並非採用的是虛擬機器模式。它直接把ActionScript代碼編譯成二進位代碼,這與XCode變成成的二進位代碼沒有區別。整個AIR運行時也變成二進位代碼。這就導致了無論是什麼大小的程式,你總要在它的基礎上加上運行時的大小——10MB+。
2. 不是BUG的BUG
由於上面描述的原因,你要把ActionScript當作OC來用,否則可能會碰到某些不是BUG的BUG。我在這篇文章中就講到了這樣一個BUG:http://zengrong.net/post/1654.htm
3. 痛苦的調試
FlashBuilder並不是面向iOS開發的,所以它的調試過程複雜且痛苦。在FlashBuilder 4.6上,我必須利用iTunes這個垃圾軟體把打包好的Debug版本的ipa檔案安裝到iOS裝置上,然後在FlashBuider上啟動調試進程。Debug版本的ipa運行十分緩慢(對,是十分),甚至因為它的緩慢,很多BUG都無法發生。
當然,這種情況在AIR 3.4出現之後有所好轉。AIR 3.4不需要iTunes就能把ipa部署到iOS裝置中進行調試。但是,目前的FlashBuilder4.6還不支援這種方式,你要使用AIR3.4的新的直接部署調試功能,就必須使用命令列,然後調用fdb來調試。
AIR 3.5支援在Release版本(非Debug版本)中輸出調試堆棧,這能讓我們用正常的速度來調試ipa,但這其實是讓我們更麻煩了。
4. 痛苦的編譯
你能忍受一次編譯需要20分鐘嗎?如果你的程式很複雜,那麼這個時間還會延長。你能忍受在發布程式之前,突然發現一個小bug,然後等待20分鐘編譯調試嗎?注意,某些bug,只能在編譯之後才會出現。
5.痛苦的ANE調試
和上面的調試不同,ANE的調試更加痛苦可不可捉摸。很多情況下,ANE的錯誤是直接FC,沒有報錯代碼,沒有訊息,解決問題只能靠猜,你能猜中嗎?
更痛苦的是,大部分情況下,使用AIR的程式員都在Windows下工作,使用AIR內建的ADL在Windows系統上調試,這種調試方法是不支援ANE的,你要測試ANE,必須打包後在iOS真實裝置上調試,這又碰到了上面說的“痛苦的調試”的情況。
不完善的小結
這種情況下可以使用AIR
- 你要開發的東西是遊戲(不要用AIR開發應用)
- 有一個Flash遊戲需要移植到iOS上(移植)
- 開發一個新遊戲,只有1個月時間(快速開發)
- 只會ActionScript和Flash(技術限制)
關於Flex
Flex SDK包含swf編譯器、swf相關工具、MXML語言和一套名為Flex的架構,這套架構大部分是做介面的事情。但即使是Adobe說他們的Flex中包含的UI組件為行動裝置做了多少最佳化,也千萬不要用它來開發行動裝置上的程式,否則你會痛苦一被子。