调试cocoa程序在程序出错时,不会马上停止。使用宏NSAssert可以让程序出错时马上抛出异常。
在debug情况下,所有NSAssert都会被执行。在release下不希望NSAssert被执行,我们通常在release种将断言设置成禁用。
设置方法:在targets种选择build,选择release。在gcc preprocessing下增加Preprocessor Macros 值为 NS_BLOCK_ASSERTIONS.
C语言调试用NSCAssert.
文章来源:
http://fei263.blog.163.com/blog/static/92793724201061611169381/
在iOS体会(一)里说过,objective-C本质上还是C,所以C里能用的标准函数,它都能用。那么在C中,类似的功能用assert。现在把assert的用法也放上来,做一下参考。
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:
#include <assert.h>
void assert( int expression );
assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,
然后通过调用 abort 来终止程序运行。
请看下面的程序清单badptr.c:
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
int main( void )
{
FILE *fp;
fp = fopen( "test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件
assert( fp ); //所以这里不会出错
fclose( fp );
fp = fopen( "noexitfile.txt", "r" );//以只读的方式打开一个文件,如果不存在就打开文件失败
assert( fp ); //所以这里出错
fclose( fp ); //程序永远都执行不到这里来
return 0;
}
[root@localhost error_process]# gcc badptr.c
[root@localhost error_process]# ./a.out
a.out: badptr.c:14: main: Assertion `fp’’ failed.
已放弃
使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。
在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:
#include <stdio.h>
#define NDEBUG
#include <assert.h>
用法总结与注意事项:
1)在函数开始处检验传入参数的合法性
如:
int resetBufferSize(int nNewSize)
{
//功能:改变缓冲区大小,
//参数:nNewSize 缓冲区新长度
//返回值:缓冲区当前长度
//说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区
assert(nNewSize >= 0);
assert(nNewSize <= MAX_BUFFER_SIZE);
...
}
2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败
不好: assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);
好: assert(nOffset >= 0);
assert(nOffset+nSize <= m_nInfomationSize);
3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题
错误: assert(i++ < 100)
这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。
正确: assert(i < 100)
i++;
4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感
5)有的地方,assert不能代替条件过滤
文章来源:
http://dev.firnow.com/course/3_program/c++/cppjs/20071111/85534.html
分享到:
相关推荐
例如,当你预期某个条件必须为真(即正常情况下应该满足的条件)时,你可以使用`NSAssert()`进行检查。如果条件不成立,`NSAssert()`将抛出一个异常,通常会包含自定义的错误描述信息。这样,开发者可以立即看到出错...
对于iOS开发者而言,掌握如何在iPhone应用中有效地集成并使用SQLite数据库显得尤为重要。 #### 二、SQLite数据库简介 SQLite是一种轻量级的嵌入式关系型数据库管理系统(RDBMS),它以源代码形式提供,并且支持跨...
因此,在开发iPhone应用时,必须注意内存的使用情况,以避免因内存不足而导致的应用崩溃或其他问题。文件中提到了几个内存管理方面的建议: - **懒加载**:不要在启动时加载所有资源,而是按需加载。例如,可以将...
- **NSAssert系列宏**:在Objective-C编程中,为了确保代码逻辑的正确性并提供调试支持,常常使用断言宏。`NSAssert`是最常用的断言宏之一,除了它之外还有其他的变体: - `NSAssert1` - `NSAssert2` - `NSAssert...
- 使用`NSAssert`进行内部逻辑检查,确保程序正常运行。 - 提供清晰的错误信息,帮助调试和用户体验。 13. **其它补充** - 遵循Apple的编程指南和最佳实践。 - 使用版本控制工具,如Git,进行代码管理和协同。 ...
- 使用断言(NSAssert)来检查代码内部的假设条件,但要注意生产环境中应关闭断言。 10. **代码审查与重构** - 定期进行代码审查,以发现潜在问题和改进点。 - 鼓励重构,保持代码结构清晰,降低复杂性。 遵循...
在实际开发中,可能需要更完善的错误处理机制,比如使用`NSAssert`进行断言,或者抛出异常,以便于追踪和修复问题。 7. **内存管理**: 在SQLite操作中,`sqlite_transient`标记用于指示绑定的字符串是临时的,...
可以通过 `NSAssert` 或 `NSCAssertionHandler` 断言来检查条件并阻止消息的发送。 **9.3 如果我更改了一个方法的实现,如何让所有代码重新编译?** 修改方法实现后,需要重新编译整个项目或受影响的部分。可以...
- 使用`NSAssert`和` Preconditions`进行代码验证,确保输入参数的有效性。 - 代码审查和单元测试:定期进行代码审查,编写单元测试,尽早发现潜在问题。 6. **崩溃日志收集和上报:** - 可以集成如Fabric/...
使用它而不是 NSAssert 的好处: 它在所有配置中都是默认的,因为它使用AG_BLOCK_ASSERTIONS而不是NS_BLOCK_ASSERTIONS 。 稍微改进了日志记录。 更少的宏和更少的混乱。 不需要任何描述字符串作为第二个参数断言将...
- **断言(Assertions)**:通过使用`NSAssert`或`assert`,可以在开发阶段检查条件,如果条件不满足则终止程序,帮助定位问题。 - **自定义异常处理**:可以实现`NSSetUncaughtExceptionHandler`来设置全局的未捕获...
- 在发布版本中,考虑使用`NSAssertionHandler`来替换调试时的`NSAssert`,以避免生产环境中因断言失败而导致的应用崩溃。 6. **测试和调试**: - 在开发过程中,充分的单元测试和集成测试有助于发现可能导致异常...
- **使用断言(Assertions)**:在开发阶段,使用`NSAssert`进行条件检查,确保程序逻辑正确。 - **处理已知的边界情况**:对可能导致异常的边缘情况进行预处理,如检查空对象、数组越界等。 - **异常捕获**:在关键...
8. **错误处理和日志**:了解如何使用NSAssert、异常处理及日志记录,这对于调试和维护代码至关重要。 通过以上分析,我们可以从"AvalonGameArt-CVS-Tycoon"源代码中学习到iOS游戏开发的全貌,从底层逻辑到上层表现...
当开发过程中某个假设不成立时,可以使用 NSAssert 或 NSCAssert 来触发断言。 - **概述**:解释了 NSAssertionHandler 的作用及如何自定义断言处理器。 - **任务**:包括配置和使用自定义断言处理器。 - **类...
例如,“NSLog”、“NSAssert”。 #### 七、实例变量与数据类型命名 - **实例变量:** 实例变量的命名应简洁明了,通常使用小写字母开头。例如,“_myVariable”。 - **常量:** 常量命名通常全部大写,使用下划线...
本章详细介绍了如何使用NSAssert进行断言,利用Xcode的调试工具如LLDB进行代码调试。 8. **UI动态性**:为适应不同屏幕尺寸和设备,我们讲解了Auto Layout和Size Classes技术,使用户界面能够自适应地调整布局。 9...