`
CshBBrain
  • 浏览: 650331 次
  • 性别: Icon_minigender_1
  • 来自: 成都
博客专栏
B7d9bf34-126e-301f-819e-81f2615b5a2a
开源WebSocket服务...
浏览量:144951
Group-logo
HTML5移动开发
浏览量:137897
社区版块
存档分类
最新评论

Wax 将Lua带人iPhone开发

 
阅读更多

【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是什么?

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:

WaxApplication

WaxApplication

通过Finder浏览到你保存该项目的文件夹。创建三个新的文件夹:wax、scripts和Classes。你的文件夹看起来应该像这样:

通过Finder浏览到你保存该项目的文件夹

设置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

改动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、博德之门、轩辕剑外传汉之云等,在移动领域最著名的便是《愤怒的小鸟》。

分享到:
评论

相关推荐

    swift-Wax用Lua开发原生iPhoneApp的框架

    Swift-Wax是一个独特的框架,它允许开发者使用Lua脚本语言来构建原生的iPhone应用程序。这一框架的独特之处在于,它将Lua的灵活性和简洁性与Swift或Objective-C的强大功能相结合,为iOS应用开发提供了一种高效且易于...

    基于wax+lua的IOS插件开发.zip

    总之,"基于wax+lua的IOS插件开发.zip"这个项目将带你进入一个使用Lua和WAX开发iOS应用的新世界。通过学习和实践,你不仅可以掌握Lua语言在iOS开发中的应用,还能了解到如何有效地结合两种语言的优势,提高开发效率...

    Lua_wax在ios上的应用.pptx

    Wax是针对iOS平台的一个开源框架,它使得开发者可以用Lua来编写原生的iPhone应用程序。Wax的核心在于桥接Objective-C和Lua,利用Objective-C的运行时机制,将Lua与iOS的UIKit和Foundation框架紧密集成。通过Wax,...

    iphone wax source code

    iphone wax源码.iphone wax源码.iphone wax源码.iphone wax源码.iphone wax源码.iphone wax源码.iphone wax源码.iphone wax源码.iphone wax源码.

    wax-master,苹果开发objective-c与Lua的交互资源文件

    Wax for iPhone这种框架在开发时,旨在把Lua脚本语言和原生Objective-C应用编程接口(API)结合起来。这意味着,你可以从Lua里面,使用任何和全部的Objective-C类及框架。

    使用Lua来开发iOS应用WaxforiOS.zip

    Wax 是个框架,允许用户使用 Lua 来编写原生的 iPhone 应用。使用 wax ,任何能用 Objective-C 做的, Lua 也同样可以实现。注意:此软件的开发者 @probablycorey 不再维护 wax 。 标签:WaxforiOS

    ios wax demo

    - Wax的核心理念是将复杂的Objective-C代码转化为易于理解和维护的Lua脚本,这大大降低了开发难度,提高了开发效率。 2. **Lua语言介绍**: - Lua是一种轻量级的、解释型的脚本语言,语法简洁,易于学习,特别...

    IOS使用lua动态生成类 dome

    Wax是将lua与Cocoa绑定的一个框架,它允许我们在lua中调用Objective-C的方法,同时也能够在Objective-C中调用lua的函数。通过wax,我们可以在lua脚本中创建Objective-C的对象,甚至动态地生成类。 步骤1:集成wax ...

    ios 运行 lua dome

    Wax是一个开源项目,它提供了一种将Lua与Objective-C集成的方式,使得在iOS应用中可以方便地运行Lua代码。本篇文章将深入探讨如何在iOS应用中使用Wax运行Lua,并通过动态生成类来实现特定功能。 首先,我们需要了解...

    swift-实现AliWax热更新Demo

    Wax是一个基于Lua语言的框架,它允许开发者用Lua编写原生的iPhone应用。Lua是一种轻量级的脚本语言,语法简洁,易于学习,非常适合用于快速原型设计和热更新场景。通过Wax,开发者可以将业务逻辑与UI分离,使得代码...

    Luakit,一个多平台的lua解决方案,你可以用这个工具开发你的应用,ios,android和flutter应用,真正的一次编写,到处使用.zip

    一个多平台的lua解决方案,你可以用这个工具开发你的应用,ios或者android应用,真正的一次编写,随处使用。注意,您只能使用luakit编写业务逻辑代码,包括network、db orm、多线程模型,但不能编写ui代码,luakit不...

    DB-WAX气相色谱

    DB-WaxFF 是具有很高重现性的微径柱,是针对香料分析进行过特别测试的DB-Wax相似的固定相. 方便你的查询。

    WaxPatch:动态加载lua脚本以更改iOS应用程序的行为

    Wax库将Lua集成到iOS应用中,让开发者能够用Lua编写部分业务逻辑,同时利用Objective-C的强大性能和系统接口。Wax的核心是它的绑定机制,它自动将Objective-C的类和方法暴露给Lua,使Lua代码可以直接调用Objective-C...

    wax_stdlib_x64:创建wax_stdlib x32-x64

    wax_stdlib_x64 感谢wax() 根据compile-stdlib来创建wax_...wax的lua版本为5.1.4,编译并安装lua 终端执行compile-stdlib.sh即可在当前文件夹生成wax_stdlib.h 如需修改32 bit,修改luac.lua: local bits = 64 --or 32

    wax.rar_V2

    对于开发人员而言,阅读并理解`wax.c`的源代码可以帮助他们了解WAX设备如何与Linux内核交互,如何处理硬件事件,以及如何优化设备性能。同时,对于系统管理员,理解驱动程序的工作机制也有助于他们在遇到问题时进行...

    一通电话也不行 WAX(赵惠丽)

    一通电话也不行韩语歌词,lrc格式~~~~~ [ti:一通电话也没有] [ar:WAX] [al:一通电话也没有] [by:匿名] [00:00.00]WAX - 一通电话也没有 [00:00.01] [00:00.02] 전화 한 번 못하니 / 벌써 날 잊어 버렸니 ……

    Wax CMS-开源

    作为一个平面文件系统,Wax CMS 不依赖数据库,而是将内容存储在文件中,这使得安装和维护变得更加简单。 1. **平面文件结构**: Wax CMS 的核心特点之一是其平面文件结构。这意味着所有内容如文章、页面等都是以...

    WAX安全浏览器 WAX浏览器 v2.0

    **WAX安全浏览器详解** WAX安全浏览器,全称为WAX浏览器v2.0,是一款在互联网领域备受瞩目的新一代安全浏览器。它以其简洁的界面设计、流畅的使用体验和强大的安全保障,为用户提供了优质的浏览服务。这款浏览器的...

    mustache-wax:Wax是Mustache.js的扩展,它可以在类似Angular过滤器的样式中使用Mustache表达式内的格式化程序

    小胡子蜡 Wax是Mustache.js的扩展,它可以在类似Angular过滤器的样式中使用Mustache表达式内的格式化程序。... 或者只是将格式化程序作为Wax函数的第二个参数传递const Mustache = require ( 'mustac

Global site tag (gtag.js) - Google Analytics