【问题标题】:Assert with string argument not working as expected使用字符串参数断言未按预期工作
【发布时间】:2013-12-05 22:34:30
【问题描述】:

编辑:正如人们在下面指出的那样,问题出在断言上。感谢您的帮助!

我有一个枚举集,我正在尝试等同,但由于某种原因它不起作用。 它的声明如下:

typedef NS_ENUM(NSUInteger, ExUnitTypes) {
    kuNilWorkUnit,
    kuDistanceInMeters,
    //end
    kuUndefined
};

我在这里使用它:

  +(NSString*) ExUnitDescription: (ExUnitTypes) exUnit
{
    if (exUnit == kuNilWorkUnit)
    {
        assert("error with units");
    }
///.... more stuff
}

Xcode 没有触发我的断言。编辑:断言仅用于测试。我也使用过 NSLog。即使值显然是 kuNilWorkUnit,条件也不评估为 true。

有人对我做错了什么有任何建议或想法吗?

【问题讨论】:

  • 您使用 assert 而不是 NSAssert 的任何原因?
  • 触发断言的不是 Xcode。这是评估 false0assert() 宏的条件。无论如何,字符串文字永远不会衰减为 NULL 指针,因此断言 assert("arbitrary string literal here"); 永远不会触发。您现在需要阅读assert() 的文档以了解问题所在以及如何解决。进一步推荐阅读的内容(仔细):man 3 abortman 3 exit 以及 C 语言中 if 语句的良好教程。
  • 我只是使用断言来测试这个问题。我可以切换到 nsassert 或 NSLog 或其他。即使我的变量显然是 kuNilWorkUnit,条件也没有评估为真。
  • @ShravanSunder 条件确实评估为真。只是 "error with units" 不会评估为 false
  • 是的,你们是对的。我不应该使用 assert()。谢谢!

标签: objective-c assert


【解决方案1】:

你想这样做:

+(NSString*) ExUnitDescription: (ExUnitTypes) exUnit
{
    assert(exUnit != kuNilWorkUnit);

    ///.... more stuff
}

这是因为,assert 只有在您传递给它的表达式为 false 时才会停止执行。由于字符串字面量总是非零,它永远不会停止执行。

现在,由于您使用的是 Objective C,而且看起来您希望有一条与您的断言相关联的消息,因此 NSAssert 会更好。

+(NSString*) ExUnitDescription: (ExUnitTypes) exUnit
{
    NSAssert(exUnit != kuNilWorkUnit, @"error with units");

    ///.... more stuff
}

【讨论】:

  • 在 Cocoa 代码中推广 NSAssert 而不是 assert 会很好。
猜你喜欢
  • 2014-05-19
  • 2016-01-23
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
相关资源
最近更新 更多