1、wax 中新建对象:
waxClass{"MyClass", NSObject}
添加协议
waxClass{"MyClass", NSObject, protocols = {"UITableViewDelegate", "UITableViewDataSource"}}
2、wax 中方法的参数,第一个默认必须是 self,这样,在该方法中,就可以通过 self 来调用一些东西。
waxClass{"MyClass", NSObject}
function storeWords(self, words)
self.words = words
self.super:words(self)
end
3、使用 冒号:代替点.
UIApplication:sharedApplication()
UIApplication.sharedApplication(UIApplication)
比较可以知道,用冒号,更加简洁
4、oc 有多参数的方法中,通过使用 “_” 下划线来代替
OC:
[UIAlertView initWithTitle:@"title" message:@"message" delegate:nil];
wax:
UIAlertView:initWithTitle_message_delegate("title", "message", nil)
5、wax 中不使用 oc 中的属性,wax强制要求使用方法来获取或者赋值
someView.frame -- 不会工作
-- 使用 setter/getter 来代替
someView:frame()
someView:setFrame(someFrame)
6、可以通过 “.” 的操作,来给对象赋值任何的值。
-- 方法通过 : 来获取
local view = UIView:init()
view.someRandomVariable = "YEAH!"
-- 可以赋任何值 并且该值持久存在
7、wax 会强制将 oc 的语法写成 lua 的语法。 即:一个方法的参数是 NSString 类型,那么,在 wax 中,应该传入的参数为 lua 的 string
local fileManager = NSFileManager:defaultManager()
local contents = fileManager:directoryContentsAtPath(".")
-- directoryContentsAtPath 返回一个数组,wax 中编程 table 类型
print(contents[1]) --> "info.plist"
-- NSDictionaries 成为 Lua 中的 tables
-- NSArrays 成为 Lua 中的 tables
-- NSStrings 成为 Lua 中的 strings
-- NSNumbers 成为 Lua 中的 numbers
8、如果需要将 wax 类型强制转换成为 oc 类型,可以使用 toobjc 这个方法
-- 如果尝试去调用 oc 的方法,这将会失败
local string = "a string"
string:capitalizedString()
-- ... 应该这个 string 已经被强制转为 lua 的 string
-- 使用 toobjc ,string 会被转换为 NSString
toobjc(string):capitalizedString()
local length = toobjc(str):length();
if not toobjc(tempDeviceID):isEqualToString(self:deviceID()) then
--xx
end
9、枚举:
系统定义的枚举都在 wax/stdlib/enums.lua 这个文件中
10、selector 使用 string 进行传递。
oc 中的写法
@selector(this:is:a:method)
在 lua 中写成
this:is:a:method
11、32/64 可以使用 wax.isArm64 来判断当前 APP 运行的设备是否是64位的 cpu
12、Structs 大部分都定义好了,在 APP_ROOT/wax/wax-scripts/structs.lua 路径下面,不需要重新创建。特别注意 NSInteger 、CGFloat ,它们在32/64位中的设备上,表现不一样。
if wax.isArm64 == true then
wax.struct.create("CGRect", "dddd", "x", "y", "width", "height")
else
wax.struct.create("CGRect", "ffff", "x", "y", "width", "height")
end
-- 创造一个全局的 CGrect 的结构体,里面包含4个参数,第二个参数 “ffff” 标识四个参数的类型
local rect = CGRect(1, 2, 3, 4)
print(rect.x) --> 1
rect.x = 200
print(rect.x) --> 200
13、 在存在的对象中,hook 其中的一个存在方法,直接写该方法,就会覆盖掉 oc 中已经写好的方法 。 如果你想调用原来的方法 ,你可以在新的方法中,增加 ORIG 的前缀
waxClass{“MyController"}
function viewDidLoad(self)
—做一些事情在原方法之前
self:ORIGviewDidLoad()--self is no need
--做一些事情在原方法之后
end
14、hook 一个扩展出来的方法,和 hook 一个对象中的方法是类似的
--OC extension
@interface MTPServer (Async4j)
- (void)startAsync4jRequest;
@end
--Lua
waxClass{"MTPServer"}
function startAsync4jRequest(self)
--做一些事情在原方法之前
self:ORIGstartAsync4jRequest()--self is no need
--做一些事情在原方法之后
end
15、如果 oc 的方法中有 “_”,那么,在 lua 中,使用 “UNDERxLINE”来代替
--OC - (void)_prefixA:(NSString *)a _b:(NSString *)b
function UNDERxLINEprefixA_UNDERxLINEb(self, a, b)
self:ORIGUNDERxLINEprefixA_UNDERxLINEb(TEST_VALUE_STRING, TEST_VALUE_STRING)
end
--OC - (id)__aa_bb_:(NSString *)v1 _cc__dd_ :(NSString *)v2 ___ee___f___:(NSString *)v3
function UNDERxLINEUNDERxLINEaaUNDERxLINEbbUNDERxLINE_UNDERxLINEccUNDERxLINEUNDERxLINEddUNDERxLINE_UNDERxLINEUNDERxLINEUNDERxLINEeeUNDERxLINEUNDERxLINEUNDERxLINEfUNDERxLINEUNDERxLINEUNDERxLINE(self, v1, v2, v3)
return self:ORIGUNDERxLINEUNDERxLINEaaUNDERxLINEbbUNDERxLINE_UNDERxLINEccUNDERxLINEUNDERxLINEddUNDERxLINE_UNDERxLINEUNDERxLINEUNDERxLINEeeUNDERxLINEUNDERxLINEUNDERxLINEfUNDERxLINEUNDERxLINEUNDERxLINE("abc", "efg", "hij")
end
16、如果有使用 “$” 符号,使用DOLLARxMARK来替代
--OC - (NSString *)$testDolorMethod;
--lua
function DOLLARxMARKtestDolorMethod( self )
print("lua $testDolorMethod")
self:ORIGDOLLARxMARKtestDolorMethod()
return "abc"
end
17、为对象添加属性
function myProperity(self)
return self._myProperity
end
function setMyProperity(self, x)
self._myProperity = x
end
18、hook dealloc 方法
waxClass{"TestDebugVC"}
function dealloc(self)
print("lua dealloc ")
---do something
self:ORIGdealloc() —如果不想调用原始的 dealloc,你就必须调用 self.super:dealloc()
—添加这一行代码去调用销毁函数
waxGCInstance(self)
end
注意: self.super:dealloc() 或者 self:ORIGdealloc() 必须要被调用,否则就是内存泄漏。
19、调用变量的方法 :变量的方法不可以动态被调用, UIAlertView可以如下调用:
local alert = UIAlertView:init();
alert:setTitle(title);
alert:setMessage("aaaa");
alert:setTitle("bbbb");
alert:setDelegate(self);
alert:addButtonWithTitle("cancel");
alert:addButtonWithTitle("ok");
alert:setTag(20147701);
alert:show();
英文原文:https://github.com/alibaba/wax/wiki/Overview