NSAssert用法
今天突然发现了一个开发ios程序时调试的好帮手—NSAssert()函数。而且和NSLog()函数一样简单易用,代码如下: NSAssert(x!=0,@”x must not be zero”);
在表达式“x!=0”不成立时,程序就会抛出异常,并显示自定义的消息”x must not be zero”,并同时显示出错的文件、代码和调用函数等信息,是一个程序追踪的很好手段。
假设x!=0,不满足要求就提示reason-x must not be zero
调试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宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:
#include
void assert( int expression );
assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,
然后通过调用 abort 来终止程序运行。
请看下面的程序清单badptr.c:
#include
#include
#include
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 的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:
#include
#define NDEBUG
#include
用法总结与注意事项:
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不能代替条件过滤
NSAssert用法的更多相关文章
- Swift的基础,操作符,字符串和集合类型
这篇文章主要讲解苹果Swift官方指南的第二章前四节的要点内容,如果想看完整的英文文档可以去苹果开发者页面下载. Basic 声明常量let 声明变量var 注释依旧使用"//" ...
- OC中的宏定义
我们都知道,宏定义是编译期常量.而OC是一种动态语言. 1.iOS系统版本判断的两个宏定义 __IPHONE_OS_VERSION_MAX_ALLOWED // iOS系统版本最大允许 __IPHON ...
- iOS-----程序异常处理----- 断言NSAssert()和NSParameterAssert区别和用处
NSAssert和assert是断言,主要的差别是assert在断言失败的时候只是简单的终止程序,而NSAssert会报告出错误信息并且打印出来.所以尽管的使用NSAssert,可以不去使用asser ...
- iOS 10开发NSAssert(断言)的使用
断言(NSAssert)的使用 字数1055 阅读3270 评论3 喜欢30 NSAssert()是一个宏,用于开发阶段调试程序中的Bug,通过为NSAssert()传递条件表达式来断定是否属于Bug ...
- iOS中Block的用法,举例,解析与底层原理(这可能是最详细的Block解析)
1. 前言 Block:带有自动变量(局部变量)的匿名函数.它是C语言的扩充功能.之所以是拓展,是因为C语言不允许存在这样匿名函数. 1.1 匿名函数 匿名函数是指不带函数名称函数.C语言中,函数是怎 ...
- EditText 基本用法
title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...
- jquery插件的用法之cookie 插件
一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...
- Java中的Socket的用法
Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...
- [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法
一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...
随机推荐
- 第一个Json.Net Demo
//序列化 private void btnShow_Click(object sender, EventArgs e) { DataTable dt = new DataTable(); DataC ...
- 防止IE不支持console.log报错
function log(msg){ if (window["console"]){//判断是否是IE console.log(msg); } }
- javascript实例学习之六—百叶窗效果
一.要结合布局才能形成百叶窗的效果 二.开启两个定时器,第一个定时器控制的是百叶窗整体一次上翻,一次下翻:另一个控制百叶窗中的各页逐次翻转,形成层次效果.否则就成了普通的滚动广告的效果了 本实现借助于 ...
- [转]qt中文乱码问题
http://blog.csdn.net/brave_heart_lxl/article/details/7186631#
- Swing 顶层容器
顶层容器值得是容纳其他容器的容器组件,包括JFrame类,JWindows类,JDialog类,JApplet等.Swing中的顶层容器类Swing提供三个顶层容器类:JFrame,JDialog和J ...
- Http错误 404.3-Not Found....或者500.19 Internal Server Error
解决方法:以管理员身份打开VS2010x64位兼容命令提示:aspnet_regiis -i
- iOS-self.layer.shouldRasterize属性
当shouldRasterize设成true时,layer被渲染成一个bitmap,并缓存起来,等下次使用时不会再重新去渲染了.实现圆角本身就是在做颜色混合(blending),如果每次页面出来时都b ...
- AJAX简单的数据增删改与分页应用
运行截图: PageBar.js: /* * 说明: * 整体思想,1.第一页时不显示:首页,上一页, * 2.最后一页时不显示:下一页,尾页 * 3.中间有 5 页导航, * 若:3.1.(总页数& ...
- Eclipse开发C++遇到的Binary not found等问题
但是一些人可能在编写实际程序的时候,主要是执行程序的时候,会遇到如下两条错误信息,而无法进行开发. Launch failed.Bianry not found A program file was ...
- paper 64:尺度空间(Scale space)理论
尺度空间方法的基本思想是:在视觉信息处理模型中引入一个被视为尺度的参数,通过连续变化尺度参数获得不同尺度下的视觉处理信息,然后综合这些信息以深入地挖掘图像的本质特征.尺度空间方法将传统的单尺度视觉信息 ...