【IOS 之愤怒的小鸟】使用Lua语言:Wax框架详解

来源:互联网 发布:react.js主要功能 编辑:程序博客网 时间:2024/04/28 14:47

我们都知道Objective-C和Cocoa语言可以开发iOS应用,但是一年前,苹果决定在iOS系统上使用Lua语言。Wax框架的想法很简单:凡是Objective-C能做的,Lua也能做!考虑使用像Lua这样一门简单而高效的编程语言,构建原生iPhone应用程序有许多充分的理由,而本文将深入探讨Wax具有的一些好处,同时演示把Lua与Xcode 4和iOS软件开发工具包(SDK)集成起来必不可少的实际步骤。


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中,这一行看起来像这样:

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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩不愿意喝奶粉爱喝乳酸菌怎么办 长安通不记名卡丢了怎么办 农村电表箱里的开关坏了怎么办 建行手机银行登录密码忘了怎么办 手机银行登入密码忘记了怎么办 邮政手机银行登录密码忘了怎么办 建设手机银行登入密码忘记了怎么办 浪琴机械表秒针走的快怎么办 雷达晶萃陶瓷表镀金掉色怎么办 做信息稿部分人员没拍到照片怎么办 二建条件不够考后审核怎么办 学校官网的教务系统忘记密码怎么办 已参加两次高考失败还想复读怎么办 我高考失利想补习学藉怎么办 本科毕业证上是1寸照片怎么办 老婆父母不给户口本迁户口怎么办 深圳夫妻投靠双方再婚的网上怎么办 老人档案丢了要继承公证怎么办 农民把户口迁入城市后宅基地怎么办 离婚了再婚带孩子在上海上学怎么办 上班几天被公司辞退不发工资怎么办 在单位工作被领导边缘化该怎么办 退休人员户口迁到外地退休金怎么办 招工表填写和实际的有误怎么办 招工时档案年龄有人为改动怎么办 8个月宝贝还不会坐怎么办 朗动导航黑屏过了保修期怎么办 平板突然黑屏开不了机了怎么办 苹果ipad锁屏密码忘了怎么办 公司发资以两张工资表怎么办 面试谈好的工资结果发少了怎么办 老板面试没谈薪资让等电话怎么办 土地局把我的档案弄丢了怎么办 人事关系在医院不去上班怎么办 档案年龄多处涂改无法退休怎么办 个人办理退休原始档案丢了怎么办 在钢厂工作想辞职了怎么办呢 场地合同到期了公司不续签怎么办 应届生没毕业找到工作怎么办入职 公司工资保密同事要看工资条怎么办 考上特岗教师后和老公异地怎么办