轉--object-C 與lua使用wax互動

來源:互聯網
上載者:User

標籤:

【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,把檔案的內容換成如下:

  1. / /這是發生奇蹟的地方! 
  2. // Wax並不使用nib檔案來裝入主視圖,一切在AppDelegate.lua檔案裡面完成 
  3. #import <UIKit/UIKit.h>    
  4. #import "wax.h"  
  5. #import "wax_http.h"  
  6. #import "wax_json.h"  
  7. #import "wax_filesystem.h"    
  8. int main(int argc, char *argv[]) {      
  9. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];      
  10.  
  11. wax_start("AppDelegate.lua", luaopen_wax_http, luaopen_wax_json, luaopen_wax_filesystem, nil);  
  12.  
  13. int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");  
  14. [pool release]; 
  15. return retVal;  
  16. }  

別忘了儲存檔案!

刪除不必要的檔案

刪除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中,這一行看起來像這樣:

  1. 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中進行“方法”調用,而是使用了“:”操作符:

  1. local view = UIView.initWithFrame(CGRect(0, 0, 100, 100)) 

--以下一模一樣

  1. view:addSubview(someView)  
  2. iew.addSubview(view, someView)  

值得一提的另一個重要方面是,Wax不支援Objective-C屬性。Wax迫使Lua和Objective-C只與方法進行聯絡。

-- 這不行

  1. someView.frame  

-- 你而是需要使用getter/setter方法

  1. View:frame() some 
  2. 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互動

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.