wax框架


LuaWax引擎,Lua目录下是Lua解释器的源代码,用于解析运行Lua脚本;Wax目录下是Wax框架的源代码.


1. 为什么可以使用Wax Lua

OC是一门动态语言,可以在运行时动态的创建一个类。先看一下平常是如何创建一个类:

     @interface UILabel : UIView <NSCoding>

     父类:UIView

     类名:UILabel

     协议:NSCoding

我们也可以用动态的方式创建一个类:

     父类

          superClass = obj_getClass(superClassName)

     创建类

          Class cls= objc_allocateClassPair(superClass, className,0)

          objc_registerClassPair(cls)

     增加变量

          class_addIvar(cls, name, size, alignment, types)

     增加方法(getter和setter)

          class_addMethod(cls, sel, imp, types)

     增加协议

          class_addProtocol(cls, protocol)

2. Wax的框架

Wax有两个重要的bridge:Lua bridge和Objective-C bridge。

Lua bridge辅助Lua调用OC

    a. 创建类

     b. 创建类的实例对象

     c. 调用OC类的方法

     d. 内存管理

     e. 类型转换Lua -> OC

Objective-C bridge辅助OC调用Lua

     a. 调用Lua类的方法

     b. 类型转换 OC -> Lua


3. 类的创建

a. 获取父类

      superClass = objc_getClass(superClassName)

b. 根据类名创建类

     klass = objc_allocateClassPair(superClass, className, 0);

c. 增加wax变量用于标记是否为wax创建的类

     class_addIvar(klass, "wax_instance_userdata", size, alignment, "*");

d. 注册类

     objc_registerClassPair(klass);

e. 重写getter和setter方法(处理OC与Lua数据的类型转换)

     class_addMethod(klass,     @selector(setValue:forUndefinedKey:),    (IMP)setValueForUndefinedKey, "v@:@@");

     将key:value转为Lua类型,再压入到wax的栈上保存

     class_addMethod(klass, @selector(valueForUndefinedKey:), (IMP)valueForUndefinedKey, "@@:@");

      将wax上的value取出并转为OC类型返回

f. 在元类中重写alloc方法(标记是否为wax创建的类)

id metaclass = object_getClass(klass); (获取元类)

     Method m = class_getInstanceMethod(metaclass, @selector(allocWithZone:));

class_addMethod(metaclass, @selector(wax_originalAllocWithZone:), method_getImplementation(m), method_getT          ypeEncoding(m));

class_addMethod(metaclass, @selector(allocWithZone:), (IMP)allocWithZone, "@@:^{_NSZone=}");

     在allocWithZone中设置wax_instance_userdata的值为YEAP

g. 添加协议

     class_addProtocol(klass, protocol)

4. 实例对象的创建

根据类名获取类对象objc_getClass,然后通过alloc和init创建。

alloc方法:调用时加入到弱表,并将引用计数加一

init方法:如果是类方法,将引用计数加一

5. 类方法的调用


6. wax对OC对象的内存管理


7. 引用计数管理

增加引用计数wax_instance_create创建类对象时,引用计数加一

wax_instance_create的使用场景

    a. 创建class object,引用class object

    b. 调用lua写的实例方法时,如果实例对象不在弱表中,对应的实例对象引用计数加一,否则引用计数不变

    c. lua调用类方法时,类对象引用计数不变

    d. lua调用类方法时,如果该方法为init方法,则引用计数加一,并标记为autoAlloc

减少引用计数下一个消息循环时,如果当前内存值超过阈值,则开始将持有对象的引用计数减一

8. 类型转换

int wax_fromObjc将OC类型转为lua类型并压入lua栈

void *wax_copyToObjc从lua栈上取出,并将lua类型转为OC类型

类型包括:

    a. void,pointer,short,char,int,unsigned int,long,float等基础类型

    b. NSString,NSArray,NSDictionary,NSValue,WaxFunction,Class等id类型

    c. struct

    d. selector

9. Objective-C bridge的功能模块

wax apiwax的初始化、启动、停止

wax class类的创建,以及协议的添加

wax instace实例的创建,并将创建的实例放入强表和弱表

wax gc定时清理不用的强表数据

wax helperslua类型和oc类型的转换,debug信息输出,错误处理

wax server网络操作

wax structwax结构数据的定义和操作

wax stdlib打包的lua bridge脚本

10. Lua bridge的功能模块

Enumsoc宏定义,lua不能直接使用oc的宏定义,需要将oc常用的enum在lua中重新定义。

waxClass根据className、superclassName、protocols创建类

Structsoc的struct定义,如CGSize,NSRange等

Helpers工具方法,包括cache,base64,time等

Ext基础类型(number、string、table、http)的常用方法



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值