我們可以使用 Xcode 自帶的 運行時工具發(fā)現代碼中的漏洞蕾久,有些難以復現的 Bug 往往使用這些工具很容易定位到,比如線程引發(fā)的資源競爭問題,內存問題等杯拐。
【1】Main thread checker【Xcode 新增特性】
當某些代碼必須在主線程執(zhí)行時顶滩,而你沒有在主線程執(zhí)行,那么 Xcode9 會提示仅醇。XXX must be used from thread only.
。這個工具 Xcode9 是默認打開的,建議開啟蛤吓。
【2】Address Sanitizer
發(fā)生內存異常時可以使用這個工具調試锅棕,比如 buffer overflow, use-after-free, double free, use after end of scope。
【3】Thread Sanitizer
定位多線程問題,比如數據爭用(Data race),想要打開這個開關,需要關閉 Address Sanitizer 钞啸,Malloc Stack 和 Memory Management 選項颖低。下面這段代碼會出現資源競爭的問題。勾選后,將會提示:
Race on a library object in -[ViewController testThreadRace] at 0x7b080000db20
Race on a library object in -[ViewController testThreadRace] at 0x7b080000db20
for (int i = 0; i < 10; i++) {
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[self testThreadRace];
});
}
- (void)testThreadRace
{
BOOL found = [_dict objectForKey:@"lefe"];
if (found) {
NSLog(@"Found");
}
[_dict setObject:@"WangSuyan" forKey:@"lefe"];
}
【4】Undefined Behavior Sanitizer 【Xcode 新增特性】
檢測未定義的行為食店,這些多數服務與 C 語言价认,因為 OC 和 Swift 相對比較安全渠退,在語言設計時就消除了大多數未定義的行為【圖 4-1】惠奸。它可以檢測到大約 15 種未定義的行為,比如常見的有數組越界梗掰,未初始化埂陆,無效的枚舉值焚虱,除數為零和空值判斷等谍咆。我們用例子來列舉幾個未定義的行為(想了解更多看官方文檔 https://developer.apple.com/documentation/code_diagnostics/undefined_behavior_sanitizer):
- (NSInteger)testUndefinedBehavior
{
NSInteger value;
if (self.name.length > 0) {
value = 12;
}
return value;
}
如果勾選 Undefined Behavior Sanitizer 這樣選項供嚎,Xcode 會提示
Variable 'value' is used uninitialized whenever 'if' condition is false
推薦閱讀
【iOS 國際化】如何把國際化時需要3天的工作量縮減到10分鐘
Promise
微信iOS數據庫是什么樣的
===== 我是有底線的 ======
喜歡我的文章着帽,歡迎關注我的新浪微博 Lefe_x,我會不定期的分享一些開發(fā)技巧