objective-c与Lua的交互(一)

第一步的学习转自于:

ios开发愤怒的小鸟的Lua语言:Wax框架详解(一)

http://www.duote.com/tech/ios/19919_3.html

011年6月的编程语言排行榜Lua语言一军突起,一举进入前十名。这与一年前苹果决定在iOS系统上使用Lua语言密不可分。但是,你了解如何用Lua语言在iOS上开发应用吗?将向各位介绍 Lua语言的iOS应用开发框架——Wax,其中在iOS平台上无比火爆的《愤怒的小鸟》就是由 Lua语言用Wax开发的。全文共分两部分,第一部分将带您深入探讨Wax具有的一些好处,同时演示把 Lua与Xcode 4和iOS软件开发工具包(SDK)集成起来必不可少的实际步骤。 第二部分将逐步介绍如何用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,把文件的内容换成如下:
[pre]

  1. / /这是发生奇迹的地方! // 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;  }

[/pre]  别忘了保存文件!
   删除不必要的文件
  删除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中,这一行看起来像这样:
[pre]

  1. waxClass{"AppDelegate", protocols = {"UIApplicationDelegate"}}

[/pre]  想通过 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中进行“方法”调用,而是使用了“:”操作符:
[pre]

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

[/pre]  --以下一模一样
[pre]

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

[/pre]  值得一提的另一个重要方面是,Wax不支持Objective-C属性。Wax迫使 Lua和Objective-C只与方法进行联系。
  -- 这不行
[pre]

  1. someView.frame

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

  1. View:frame() some View:setFrame(someFrame)

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

附件是自己通过以上步骤做的测试代码。

相关资源: http://www.duote.com/tech/ios/19919.html#contentbody
http://lua-users.org/wiki/

附件:    WaxApplication.zip (468 K) 下载次数:236

objective-c与Lua的交互(一)相关推荐

  1. JS在与lua的交互心得

    最近在写一个项目,前端技术使用的是Vue,在与lua的交互过程,是通过一个公共JS,前端调用公共js的方法给lua发送命令,lua接到命令,去执行一些方法,然后又通过回调返回到了前端,由于是第一次写这 ...

  2. lua和unity如何交互_Unity中C#对象与Lua之间交互的原理

    lua与其他语言交互,都是通过操作虚拟栈交流的.而操作虚拟栈最原始的方法就是通过lua与c语言的api,由于直接操作lua与c比较繁琐而且容易出错.因此tolua作为中间层而存在. 那么unity要把 ...

  3. LUA C 交互 cocos

    注册 函数给Lua使用 lua_newtable(L); lua_pushstring(L, "callStaticMethod"); lua_pushcfunction(L, L ...

  4. 添加lua_C++/Lua高级交互

    C代码: g_Runtime->set_on_connection([](TCPConnection& conn) {//调用lua函数 on_connection(conn) }); ...

  5. lua C交互函数注释

    void lua_rawset (lua_State *L, int index); 类似于 lua_settable,但是是作一个直接赋值(不触发元方法). 转载于:https://www.cnbl ...

  6. Lua和C语言的交互——C API

    Lua可作为扩展性语言(Lua可以作为程序库用来扩展应用的功能),同时也是个可扩展的语言(Lua程序中可以注册由其他语言实现的函数). C和Lua交互的部分称为C API.C API是一个C代码与Lu ...

  7. C++和Lua交互教程(基于LuaBridge)

    作者:查志旺 ,向日葵远程控制软件前端开发工程师. 最近公司需要做向日葵远程控制软件跨平台项目,为了代码的可复用性,需嵌入跨平台脚本语言,我们选择了Lua,理由是Lua由标准C编写而成,几乎在所有操作 ...

  8. iOS端手游和c++交互 lua和c++交互

    iOS端手游和c++交互 lua和c++交互 进了一家新的手游公司,坐标杭州,因为之前是做发行做了一段时间,才知道互联网真正赚钱的是手游.所以从武汉来杭州就一心想找一家手游公司,从而深入了解一下iOS ...

  9. 【转贴】Lua 5.0 参考手册

    作者: Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes Copyright © 2003 Tecgraf, PUC ...

最新文章

  1. 10.6监控io性能10.7free命令10.8ps命令10.9查看网络状态10.10linux抓包
  2. windows下gdb的下载和安装使用初步
  3. 论文笔记:Unsteady Multi-Element Time Series Analysis and Prediction Based on Spatial-Temporal Attention
  4. 05-WIFI通讯客户端搭建
  5. centos6安装mysql并远程连接_Ubantu下MySQL安装、部署和远程连接
  6. React开发(201):react代码分割之打包导出
  7. linux vi 撤销与恢复,vi撤销与恢复
  8. java 如何关闭会话_java-在会话到期时关闭弹出窗口
  9. SQL Server中的功能与存储过程
  10. 巨详细 - Win8 + Hyper-V 虚拟机性能简测与虚拟化技术科普(一)
  11. flink checkpoint 重启_Flink进阶教程:Checkpoint机制原理剖析与参数配置
  12. su and sudo
  13. 中文OCR的汉字按常见度的划分
  14. java中模糊查询sql怎么写_java模糊查询sql语句
  15. 判断USB打印机离线状态
  16. 【小程序按钮控制视频播放暂停】
  17. 电脑快捷键大全 Alt
  18. 15_微信小程序之svg地图自定义组件编写
  19. 小红拿到了一个数组,她想取一些数使得取的数之和尽可能大,但要求这个和必须是 k 的倍数。你能帮帮她吗?
  20. 数据查询和业务流分开_一文带你了解大数据管道

热门文章

  1. linux执行lsof命令_linux lsof命令详解
  2. 《Android 应用案例开发大全(第3版)》——第2.5节 辅助绘制类
  3. C/C++数字转字符串
  4. Apache配置应用与日志管理__GongWei1997
  5. 零基础入门UI设计,如何提升审美能力呢?
  6. gemfire demo
  7. 使用kubeadm升级K8S
  8. Ubuntu上面搭建Java开发环境
  9. Henry手记—Web Form中的Datagrid的自定义分页 (转)
  10. 拉卡拉支付有效引导消费习惯转变