2011-10-06 162 views
6

我正在讀通過樣品代碼ListAdder,並且有許多變量之後斷言,或幾乎所有的方法中使用,例如:爲什麼在項目中使用'assert'? (爲什麼使用它這麼多次)

self.formatter = [[[NSNumberFormatter alloc] init] autorelease]; assert(self.formatter != nil);

或:

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    #pragma unused(tv) 
    #pragma unused(indexPath) 
    UITableViewCell * cell; 

    assert(tv == self.tableView); 
    assert(indexPath != NULL); 
    assert(indexPath.section < kListAdderSectionIndexCount); 
    assert(indexPath.row < ((indexPath.section == kListAdderSectionIndexNumbers) ? [self.numbers count] : 1)); 

我想知道,有什麼意思呢?

感謝

回答

5

它是Design by ContractDbC的實現。目標C對DbC的前置條件,後置條件和不變式都沒有本地支持,但特別是後置和前提條件可以用宏很好地實現。

下面是Objective C的實現DbC一些其他的方法:

2

斷言的一點是要確保蟲子馬上顯示出來,並在容易診斷的方式,而不是作爲微妙的不當行爲以後。在這種情況下,該代碼的開發人員希望確保在其代碼運行後有4個條件成立。

2

斷言檢查程序員關於如何調用代碼的假設。如果假設錯誤,斷言將失敗並拋出異常。這會使代碼儘早失敗。

是否這樣做是一個爭論點。它可能會被採取太遠。

+0

我不瞭解Objective C,但用其他語言可以在編譯時禁用它們,這樣它們不會減慢實時系統的速度,但可以在測試和分級過程中將它們用於錯誤檢測。 – corsiKa

相關問題