2011-10-06 149 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

相关问题