下载和编译Lua解析器
首先,跳转到Lua官网的下载页将源码下载下来。然后解压下载包可以得到如下图所示的目录结构:
image.png
对应的目录说明如下表:
image.png
编译Lua源码
在这里我们只需要src目录中的源码文件,先打开src目录,将Makefile、lua.c、luac.c三个文件删除掉,需要说明的是lua.c和luac.c文件是用于编译生成lua和luac两个命令不属于解析器的功能,如果不删除可能会导致XCode无法编译通过。
接下来打开XCode创建一个新的项目并把src目录拖入项目中。如下图所示:
image.png
然后Command+B进行编译,提示编译成功!
Lua C Api 与 栈
在开始实现Lua与OC交互之前先来了解两个非常重要的概念,一个是Lua的C Api,Lua的脚本解析器是使用C语言来编写的(基于C语言的源码跨平台特性,使得Lua可以在各种系统下面使用),因此它提供了丰富的C语言定义的接口来访问和操作Lua中的所有元素,掌握这些C Api可以更加灵活和方便地扩展Lua的功能,下面的交互实现正是使用这些C Api进行实现的。
另外一个就是栈 的概念,在Lua和C进行交互数据的时候会用到了一个栈的结构,栈中的每个元素都能保存任何类型的Lua值。要获取Lua中的一个值时,需要调用一个C Api函数,Lua就会将特定的值压入栈中,然后再通过相应的C Api将值取出来,如图所示:
image.png
同样,要将一个值传给Lua时,需要先调用C Api将这个值压入栈,然后再调用C Api,Lua就会获取该值并将其从栈中弹出。 如图所示:
image.png
初始化Lua环境
Lua环境的维护需要一个叫lua_State的结构体来支持,其贯穿了整个执行过程。因此,要使用Lua则需要先初始化一个lua_State结构体。修改ViewController的代码如下:
#import "lua.h"
#import "lauxlib.h"
#import "lualib.h"
@interface ViewController ()
@property (nonatomic) lua_State *state; //定义一个lua_State结构
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.state = luaL_newstate(); //创建新的lua_State结构体
luaL_openlibs(self.state); //加载标准库
}
@end
参考链接:
Lua与ObjC的交互