SwiftMonkey源碼解讀

在閱讀SwiftMonkey源碼的過程中,由于對swift語言還不是很了解爆办,所以先補了一下swift的基本語法。理解swift以下幾個語法點后,就很容易讀懂SwiftMonkey的源碼了锨推。

1.swift的函數(shù)定義格式為func 函數(shù)名(參數(shù)名:類型) -> 函數(shù)返回類型

如下面這段代碼,addAction方法有兩個參數(shù)weight和action公壤,weight是double類型换可;action是一個閉包參數(shù),接受一個無入?yún)⑾梅瑹o返回值的閉包沾鳄。其中@escaping標識符標識該閉包是允許“逃逸”出這個函數(shù)的,也就是允許這個閉包在函數(shù)返回之后才被執(zhí)行确憨。

    public func addAction(weight: Double, action: @escaping (Void) -> Void) {
        totalWeight += weight
        randomActions.append((accumulatedWeight: totalWeight, action: action))
    }
2.閉包的使用

如下面這段代碼译荞,這段代碼調(diào)用了上面的addAction方式。調(diào)用時在addAction后面緊跟著的{}中定義閉包休弃。其中[weak self]表示弱引用磁椒。

    public func addXCTestTapAction(weight: Double, multipleTapProbability: Double = 0.05,
    multipleTouchProbability: Double = 0.05) {
        addAction(weight: weight) { [weak self] in  //弱引用而已
            let numberOfTaps: UInt
            if self!.r.randomDouble() < multipleTapProbability {
                numberOfTaps = UInt(self!.r.randomUInt32() % 2) + 2
            } else {
                numberOfTaps = 1
            }

            let locations: [CGPoint]
            if self!.r.randomDouble() < multipleTouchProbability {
                let numberOfTouches = Int(self!.r.randomUInt32() % 3) + 2
                let rect = self!.randomRect()
                locations = (1...numberOfTouches).map { _ in
                    self!.randomPoint(inRect: rect)
                }
            } else {
                locations = [ self!.randomPoint() ]
            }

            let semaphore = DispatchSemaphore(value: 0)
            self!.sharedXCEventGenerator.tapAtTouchLocations(locations, numberOfTaps: numberOfTaps, orientation: orientationValue) {
                semaphore.signal()
            }
            semaphore.wait()
        }
    }

swift語法還有很多精髓,像弱引用等具體概念可以查看The Swift Programming Language中文版玫芦。但清楚上面兩點后浆熔,理解SwiftMonkey的源碼就沒問題了。

SwiftMonkey的源碼層次如下圖所示桥帆,首先實例化Monkey医增,然后調(diào)用addDefaultXCTestPrivateActions來插入一些隨機事件,然后調(diào)用addXCTestTAPalertAction方法用來對彈窗進行處理老虫,最后則調(diào)用monkeyAround方法執(zhí)行隨機事件叶骨。在SwiftMonkey源碼中,還有一個MonkeyUIAutomation.swift文件祈匙,這個文件是通過UIAutomation的私有api生成隨機事件忽刽,但目前處于被棄用狀態(tài)。(看作者說是這套方法不能正常使用)還有一個Random.swift文件夺欲,這里面定義了一些隨機生成器的方法跪帝。


Image.png

最后補充說一點,私有api的查看可以借助class-dump工具些阅。我通過class-dump工具找到了再SwiftMonkey中使用的幾個私有api.

class-dump /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks/XCTest.framework

上述命令的返回結(jié)果中有下面這一段伞剑,紅框中的幾個私有api正是在SwiftMonkey中使用的。


E698F7B4-6950-47FF-AC83-81561854A9F4.png

上述文章中若有理解有誤的地方市埋,歡迎指正黎泣,謝謝恕刘。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市抒倚,隨后出現(xiàn)的幾起案子褐着,更是在濱河造成了極大的恐慌,老刑警劉巖托呕,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件献起,死亡現(xiàn)場離奇詭異,居然都是意外死亡镣陕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進店門姻政,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呆抑,“玉大人,你說我怎么就攤上這事汁展∪蛋” “怎么了?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵食绿,是天一觀的道長侈咕。 經(jīng)常有香客問我,道長器紧,這世上最難降的妖魔是什么耀销? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮铲汪,結(jié)果婚禮上熊尉,老公的妹妹穿的比我還像新娘。我一直安慰自己掌腰,他們只是感情好狰住,可當我...
    茶點故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著齿梁,像睡著了一般催植。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上勺择,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天创南,我揣著相機與錄音,去河邊找鬼省核。 笑死扰藕,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的芳撒。 我是一名探鬼主播邓深,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼未桥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了芥备?” 一聲冷哼從身側(cè)響起冬耿,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎萌壳,沒想到半個月后亦镶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡袱瓮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年缤骨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尺借。...
    茶點故事閱讀 40,928評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡绊起,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出燎斩,到底是詐尸還是另有隱情虱歪,我是刑警寧澤,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布栅表,位于F島的核電站笋鄙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏怪瓶。R本人自食惡果不足惜萧落,卻給世界環(huán)境...
    茶點故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望洗贰。 院中可真熱鬧铐尚,春花似錦、人聲如沸哆姻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捡鱼。三九已至,卻和暖如春坡疼,著一層夾襖步出監(jiān)牢的瞬間箕昭,已是汗流浹背灵妨。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留落竹,地道東北人泌霍。 一個月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像述召,于是被迫代替她去往敵國和親朱转。 傳聞我的和親對象是個殘疾皇子蟹地,可洞房花燭夜當晚...
    茶點故事閱讀 45,937評論 2 361

推薦閱讀更多精彩內(nèi)容