標籤:
【51CTO獨家譯文】2011年6月的程式設計語言熱門排行榜Lua語言一軍突起,一舉進入前十名。這與一年前蘋果決定在iOS系統上使用Lua語言密不可分。但是,你瞭解如何用Lua語言在iOS上開發應用嗎?51CTO將向各位介紹Lua語言的iOS應用開發架構——Wax,其中在iOS平台上無比火爆的《憤怒的小鳥》就是由Lua語言用Wax開發的。全文共分兩部分,第一部分51CTO將帶您深入探討Wax具有的一些好處,同時示範把Lua與Xcode 4和iOS軟體開發套件(SDK)整合起來必不可少的實際步驟。第二部分51CTO將逐步介紹如何用Wax構建一個簡單的應用程式,顯示Twitter上的當前趨勢話題列表,可以用按鈕來更新內容。
Wax是什麼?
Wax for iPhone這種架構在開發時,旨在把Lua指令碼語言和原生Objective-C應用編程介面(API)結合起來。這意味著,你可以從Lua裡面,使用任何和全部的Objective-C類及架構。
從技術上來講,Wax結合了Objective-C類和原生C代碼。Lua語言嵌入了C語言,然後Objective-C類併入到其中。
為什麼使用Wax?
Wax是免費的、開源的。與其他一些基於Lua的移動開發解決方案不同,Wax是個開源架構,只需要你花一點點時間就可以上手,不需要花錢。不喜歡Wax的工作方式,或者發現實施方面的缺陷?原始碼可免費擷取,你總是可以改動原始碼,以滿足自己的需要。
可以利用原生API。這意味著,為教Objective-C而編寫的教程很容易由Lua for Wax來改動和編寫。這還意味著,你的應用程式在外觀感覺上總是如同原生應用程式,不過又得到了用Lua這種高效指令碼語言編寫代碼可以節省時間的好處。
可以使用Xcode。這意味著,模擬器和裝置部署都輕而易舉,不會輕易與未來的iOS版本決裂。
可以利用所有現有的Objective-C庫。如果你有一個Objective-C類是以前編寫的,不需要改動,就可以將它用在Lua中——只要把它放入到Xcode。Three20之類的庫也是一樣。只要按照正常指令來添加庫,就可以使用Lua代碼訪問它們。
可以利用Wax Lua模組。Wax有幾個內建的Lua模組,使得非同步HTTP請求和JavaScript對象標註(JSON)建立/解析極其容易而快速(因為模組是用C編寫的)。
沒必要管理記憶體。不再需要操心記憶體配置之類的事務。Wax為你處理這一切。
Lua類型自動轉換成對應的Objective-C類型,反之亦然。 這意味著,如果你調用了需要NSString和NSInteger的某個方法,但傳送了Lua字串和Lua整數,Wax會為你搞定轉換工作。這種轉換功能強大,甚至可以處理複雜的Objective-C特性,比如選取器。
你可以利用所有上述特性。不需要精挑細選。你獲得所有特性!
OK,實在太棒了!我該如何安裝Wax?
首先你需要Xcode和iPhone SDK。要是你還沒有這些東西,趕緊弄一份!
用Xcode建立項目
我們先建立一個新的“基於Windows的項目”,名為“WaxApplication”。別忘了把裝置設定成iPhone:
通過Finder瀏覽到你儲存該項目的檔案夾。建立三個新的檔案夾:wax、scripts和Classes。你的檔案夾看起來應該像這樣:
設定Wax(第一部分,處理檔案)
首先,下載原始碼的壓縮包。Wax放在GitHub上(https://github.com/probablycorey/wax),那樣下載原始碼就很容易。從這裡下載壓縮包。
現在,解壓縮剛下載的檔案。瀏覽到剛解壓縮的檔案夾。它會有“probablycorey-wax-124ca46”之類的名稱。
你的螢幕現在看起來應該像這樣:
現在,執行下列操作:
◆拷貝lib和bin檔案夾,把它們粘貼到位於WaxApplication專案檔夾裡面的wax檔案夾。
◆將xcode-template/Classes/ProtocolLoader.h拷貝到WaxApplication專案檔夾。
◆拷貝xcode-template/scripts/檔案夾,將它放到WaxApplication專案檔夾裡面。
◆開啟WaxApplication專案檔夾裡面的wax/lib/extensions/檔案夾。刪除SQLite和xml檔案夾,所示:
你的螢幕應該看起來像這樣:
設定Wax(第二部分,設定項目)
現在用Finder選擇Classes、scripts和wax檔案夾,把它們拖入到Xcode項目中。把它們放到顯示“Wax Application”和“1 target, iOS SDK X.X”的那個條下方。不要勾選顯示“Copy items into destination group’s folder(if needed)”的複選框。點擊完成。
現在點擊顯示“Wax Application”和“1 target, iOS SDK 4.3”的那個條。接著採取下列步驟:
◆在右邊窗格中,尋找“Targets”標題,點擊“WaxApplication”。點擊“Build Phases”(構建階段)選項卡。點擊“Copy Bundle Resources”(複製捆綁資源),清除所有lua檔案。
◆在右下角,先點擊“Add Build Phase”(添加構建階段),再點擊“Add Run Script”(添加運行指令碼)。
◆將Shell設成/bin/zsh
◆將Shell下面的文本地區設成“$PROJECT_DIR/wax/lib/build-scripts/copy-scripts.sh”。
你的螢幕現在看起來像這樣:
改動main.m
在左邊窗格中,開啟名為“WaxApplication”的檔案夾。接下來,開啟“Supporting Files”檔案夾。接著,開啟main.m,把檔案的內容換成如下:
- / /這是發生奇蹟的地方!
- // Wax並不使用nib檔案來裝入主視圖,一切在AppDelegate.lua檔案裡面完成
- #import <UIKit/UIKit.h>
- #import "wax.h"
- #import "wax_http.h"
- #import "wax_json.h"
- #import "wax_filesystem.h"
- int main(int argc, char *argv[]) {
- NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
-
- wax_start("AppDelegate.lua", luaopen_wax_http, luaopen_wax_json, luaopen_wax_filesystem, nil);
-
- int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");
- [pool release];
- return retVal;
- }
別忘了儲存檔案!
刪除不必要的檔案
刪除MainWindow.xib、WaxApplicationAppDelegate.h和WaxApplicationAppDelegate.m三個檔案。開啟“WaxApplication/Supporting Files/WaxPallication-Info.plist”,然後刪除鍵是“Main nib file base name”的那一行。
測試安裝的Wax
按?↵(命令+斷行符號鍵),或者按左上方的“Run”,就可以在模擬器中運行應用程式。要是一切正常,你會看到一個簡單的應用程式會說“Hello Lua!”。
要是你沒看到這個訊息,檢查之前的步驟,看看有沒有步驟漏了。
查看Lua
展開Scripts檔案夾,開啟AppDelegate.lua。你會看到運行該應用程式的Lua代碼。
你可能會先注意到,沒有文法高亮。遺憾的是,對於Xcode中的Lua文法高亮問題,我還沒有發現穩定的解決方案(是你發現了,請留言告訴我!)。
接下來你可能會注意到,沒有方括弧,不過使用了像UIScreen和UIWindow這些類。那是由於你在使用Lua構建一個AppDelegate類;在蘋果和蘋果的代碼看來,你在使用Objective-C、構建Objective-C類!
方法名稱
你可能還注意到奇怪的方法名稱“colorWithRed_green_blue_alpha”。要是你熟悉Objective-C,就知道方法名稱可以有冒號。Lua中的函數名稱不能有冒號。為了補償這個差異,凡是Objective-C中隔開方法名稱的地方,在Lua中都換成底線。比如說:
Objective-C中的colorWithRed:green:blue:alpha對應於Lua中的colorWithRed_green_blue_alpha。
Objective-C 中的selectRowAtIndexPath:animated:scrollPosition:對應於Lua中的selectRowAtIndexPath_animated_scrollPosition
物件導向的模型
Lua的另一個問題是,它沒有像Objective-C那樣的繼承體系。Lua中根本沒有類。為了克服這個問題,Wax反白了放在每個Wax Lua檔案最前面的一個函數:waxClass。在預設的AppDelegate.lua中,這一行看起來像這樣:
- waxClass{"AppDelegate", protocols = {"UIApplicationDelegate"}}
想通過Lua建立一個Objective-C類,就要使用waxClass{“CLASS NAME”, “PARENT_CLASS”}這個函數。你添加到該Lua檔案的所有之後的函數(在同一個檔案裡面)都會作為執行個體方法,自動添加到新的類。
AppDelegate.lua的這一行顯示,還可以定義你的“類”定義哪些協議。
雖然waxClass解決了定義Objective-C可以使用的類這個問題,但還是存在一個問題:由於Lua沒有類,它沒有像Objective-C那樣的動態“自”變數。為了克服這個問題,Wax自動將每個方法的第一個變數作為類的當前執行個體。你可以發現,當你查看AppDelegate.lua中的“applicationDidFinishLaunching”時,第一個變數是“自”變數,即使Objective-C版的這個方法只有1個變數。然而,如果你非得將類的當前執行個體作為每個方法的第一個變數來傳送,就會很煩人,於是添加了一些文法上的便利(syntactical sugar)。不是使用“.”操作符在Lua中進行“方法”調用,而是使用了“:”操作符:
- local view = UIView.initWithFrame(CGRect(0, 0, 100, 100))
--以下一模一樣
- view:addSubview(someView)
- iew.addSubview(view, someView)
值得一提的另一個重要方面是,Wax不支援Objective-C屬性。Wax迫使Lua和Objective-C只與方法進行聯絡。
-- 這不行
- someView.frame
-- 你而是需要使用getter/setter方法
- View:frame() some
- View:setFrame(someFrame)
只用於Lua的變數
你可以使用點.操作符,為任何Objective-C對象建立成員變數。不像冒號:操作符(用於對Objective-C類/執行個體調用方法),點.操作符可以針對對象的Lua方面,動態建立成員變數(對象的Objective-C方面對這些變數一無所知)。在對象的生命週期之內,都可以使用成員變數。
輸出到控制台
AppDelegate.lua還顯示了你如何可以編寫調試文本、輸出到控制台。你可以使用函數“puts”。
記憶體管理
我之前說過,使用Lua的話,你根本沒必要分配、保留和釋放記憶體。你在調用任何初始化器之前,根本不需要調用記憶體配置。實際上,如果你這麼做的話,程式可能會出現記憶體流失。
太棒了!接下來做什麼?
你已經深入瞭解了專門針對Wax的Lua的基本知識,就可以準備編寫iPhone應用程式了!
在這個教程的第二個部分,我們將只用幾行Lua,就可以編寫出擁有重新整理按鈕的一個Twitter應用程式範例。
看完這個教程是不是你也有信心打造出自己的《憤怒的小鳥》呢?
小貼士
Lua程式設計語言 是一個簡潔、輕量、可擴充的指令碼語言。Lua讀作/‘lua/(嚕啊),是葡萄牙語中"Luna"(月亮)的意思。
Lua是一種輕量語言,它的官方版本只包括一個精簡的核心和最基本的庫。這使得Lua體積小、啟動速度快。它用標準C語言編寫並以原始碼形式開放,編譯後僅僅一百餘K,可以很方便的嵌入別的程式裡。和許多"大而全"的語言不一樣,網路通訊、圖形介面等都沒有預設提供。但是Lua可以很容易地被擴充:由宿主語言(通常是C或C++)提供這些功能,Lua可以使用它們,就像是本來就內建的功能一樣。事實上,現在已經有很多成熟的擴充模組可供選用。
Lua的目標是成為一個很容易嵌入其它語言中使用的語言。大多數程式員也認為它的確做到了這一點。
很多應用程式使用Lua作為自己的嵌入式指令碼語言,以此來實現可配置性、可擴充性。這其中包括大話西遊II、仙境傳說、魔獸世界、戰錘40k、博德之門、軒轅劍外傳漢之雲等,在移動領域最著名的便是《憤怒的小鳥》。
轉--object-C 與lua使用wax互動