gpt4 book ai didi

iphone - 断言或 NSAssert 在实践中有何用处?

转载 作者:行者123 更新时间:2023-12-03 18:21:54 26 4
gpt4 key购买 nike

我想知道到处使用 NSAssert 是否是一个好习惯?这样做有什么好处?在什么情况下最好使用它?

最佳答案

广泛使用 NSAssert() 不会将 ObjC 变成 Eiffel,但只要您记住它的实际实现方式和作用,它仍然是一个相当好的实践。关于 NSAssert() 需要记住的事情:

默认情况下,Xcode 在 Release模式下不会关闭 NSAssert()。您必须记住将 NS_BLOCK_ASSERTIONS 添加到 xcconfig 中的 GCC_PREPROCESSOR_DEFINITIONS 中。 (你是 using xcconfigs ,对吧?)一个常见的问题是在 nil 悄悄起作用的情况下断言非 nil ;这可能意味着本可以顺利恢复的事物会发生现场崩溃。这与 assert() 使用的 NDEBUG 宏无关,如果您的代码包含两种类型的断言,则必须记住定义这两者。

如果您在 Release模式下编译 NSAssert(),那么当客户向您发送日志时,您不会得到任何指示,表明问题发生在哪里。我个人将 NSAssert() 封装在我自己的宏中,这些宏始终记录日志,即使在 Release模式下也是如此。

NSAssert() 通常会强制执行重复的逻辑。考虑测试 C++ 指针是否为 NULL 的情况。您使用 NSAssert(),但您仍然还需要使用简单的 if() 测试以避免现场崩溃。这种重复的代码可能成为错误的根源,并且我见过由于断言不再有效而失败的代码。 (幸运的是,这通常处于 Debug模式!)我已经争论了很多如何创建一个将断言和 if() 结合起来的宏,但是很难做到不脆弱或使代码变得困难来理解。

由于上一期,我通常将“NSAssert(NO, ...)”放在 else{} 子句中,而不是在顶部执行断言方法。这并不理想,因为它将契约(Contract)从方法签名中移开(从而减少了其文件效益),但这是我在实践中发现的最有效的方法。

关于iphone - 断言或 NSAssert 在实践中有何用处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1374474/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com