1剑逃、wax 中新建對(duì)象:
waxClass{"MyClass", NSObject}
添加協(xié)議
waxClass{"MyClass", NSObject, protocols = {"UITableViewDelegate", "UITableViewDataSource"}}
2、wax 中方法的參數(shù)官辽,第一個(gè)默認(rèn)必須是 self蛹磺,這樣,在該方法中同仆,就可以通過 self 來調(diào)用一些東西萤捆。
waxClass{"MyClass", NSObject}
function storeWords(self, words)
self.words = words
self.super:words(self)
end
3、使用 冒號(hào):代替點(diǎn).
UIApplication:sharedApplication()
UIApplication.sharedApplication(UIApplication)
比較可以知道俗批,用冒號(hào)俗或,更加簡(jiǎn)潔
4、oc 有多參數(shù)的方法中岁忘,通過使用 “_” 下劃線來代替
OC:
[UIAlertView initWithTitle:@"title" message:@"message" delegate:nil];
wax:
UIAlertView:initWithTitle_message_delegate("title", "message", nil)
5辛慰、wax 中不使用 oc 中的屬性,wax強(qiáng)制要求使用方法來獲取或者賦值
someView.frame -- 不會(huì)工作
-- 使用 setter/getter 來代替
someView:frame()
someView:setFrame(someFrame)
6干像、可以通過 “.” 的操作昆雀,來給對(duì)象賦值任何的值。
-- 方法通過 : 來獲取
local view = UIView:init()
view.someRandomVariable = "YEAH!"
-- 可以賦任何值 并且該值持久存在
7蝠筑、wax 會(huì)強(qiáng)制將 oc 的語法寫成 lua 的語法狞膘。 即:一個(gè)方法的參數(shù)是 NSString 類型,那么什乙,在 wax 中挽封,應(yīng)該傳入的參數(shù)為 lua 的 string
local fileManager = NSFileManager:defaultManager()
local contents = fileManager:directoryContentsAtPath(".")
-- directoryContentsAtPath 返回一個(gè)數(shù)組,wax 中編程 table 類型
print(contents[1]) --> "info.plist"
-- NSDictionaries 成為 Lua 中的 tables
-- NSArrays 成為 Lua 中的 tables
-- NSStrings 成為 Lua 中的 strings
-- NSNumbers 成為 Lua 中的 numbers
8臣镣、如果需要將 wax 類型強(qiáng)制轉(zhuǎn)換成為 oc 類型辅愿,可以使用 toobjc 這個(gè)方法
-- 如果嘗試去調(diào)用 oc 的方法智亮,這將會(huì)失敗
local string = "a string"
string:capitalizedString()
-- ... 應(yīng)該這個(gè) string 已經(jīng)被強(qiáng)制轉(zhuǎn)為 lua 的 string
-- 使用 toobjc ,string 會(huì)被轉(zhuǎn)換為 NSString
toobjc(string):capitalizedString()
local length = toobjc(str):length();
if not toobjc(tempDeviceID):isEqualToString(self:deviceID()) then
--xx
end
9点待、枚舉:
系統(tǒng)定義的枚舉都在 wax/stdlib/enums.lua 這個(gè)文件中
10阔蛉、selector 使用 string 進(jìn)行傳遞。
oc 中的寫法
@selector(this:is:a:method)
在 lua 中寫成
this:is:a:method
11癞埠、32/64 可以使用 wax.isArm64 來判斷當(dāng)前 APP 運(yùn)行的設(shè)備是否是64位的 cpu
12状原、Structs 大部分都定義好了,在 APP_ROOT/wax/wax-scripts/structs.lua 路徑下面苗踪,不需要重新創(chuàng)建颠区。特別注意 NSInteger 、CGFloat 通铲,它們?cè)?2/64位中的設(shè)備上毕莱,表現(xiàn)不一樣。
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
-- 創(chuàng)造一個(gè)全局的 CGrect 的結(jié)構(gòu)體颅夺,里面包含4個(gè)參數(shù)朋截,第二個(gè)參數(shù) “ffff” 標(biāo)識(shí)四個(gè)參數(shù)的類型
local rect = CGRect(1, 2, 3, 4)
print(rect.x) --> 1
rect.x = 200
print(rect.x) --> 200
13、 在存在的對(duì)象中吧黄,hook 其中的一個(gè)存在方法质和,直接寫該方法,就會(huì)覆蓋掉 oc 中已經(jīng)寫好的方法 稚字。 如果你想調(diào)用原來的方法 饲宿,你可以在新的方法中,增加 ORIG 的前綴
waxClass{“MyController"}
function viewDidLoad(self)
—做一些事情在原方法之前
self:ORIGviewDidLoad()--self is no need
--做一些事情在原方法之后
end
14胆描、hook 一個(gè)擴(kuò)展出來的方法瘫想,和 hook 一個(gè)對(duì)象中的方法是類似的
--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短绸、如果有使用 “$” 符號(hào)车吹,使用DOLLARxMARK來替代
--OC - (NSString *)$testDolorMethod;
--lua
function DOLLARxMARKtestDolorMethod( self )
print("lua $testDolorMethod")
self:ORIGDOLLARxMARKtestDolorMethod()
return "abc"
end
17、為對(duì)象添加屬性
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() —如果不想調(diào)用原始的 dealloc窄驹,你就必須調(diào)用 self.super:dealloc()
—添加這一行代碼去調(diào)用銷毀函數(shù)
waxGCInstance(self)
end
注意: self.super:dealloc() 或者 self:ORIGdealloc() 必須要被調(diào)用,否則就是內(nèi)存泄漏证逻。
19乐埠、調(diào)用變量的方法 :變量的方法不可以動(dòng)態(tài)被調(diào)用, UIAlertView可以如下調(diào)用:
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();