调试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不能代替条件过滤

转载于:https://www.cnblogs.com/needly/p/3427127.html

NSAssert与assert断言相关推荐

  1. Python assert断言函数及用法

    Python assert断言函数及用法 Python assert 语句,又称断言语句,可以看做是功能缩小版的 if 语句,它用于判断某个表达式的值,如果值为真,则程序可以继续往下执行:反之,Pyt ...

  2. python assert 断言的作用

    python assert 断言句语格式及用法很简单.在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件时就崩溃,这时候就需要assert断言的帮助.本文主要是 ...

  3. Python assert 断言

    assert断言语句用来声明某个条件是真的,其作用是测试一个条件(condition)是否成立,如果不成立,则抛出异常. assert一般用法: assert condition 如果conditio ...

  4. Python assert 断言函数

    使用assert断言是学习python一个非常好的习惯,python assert 断言句语格式及用法很简单.在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件 ...

  5. matlab语言中的assert断言函数

    1.MATLAB语言没有系统的断言函数,但有错误报告函数 error 和 warning.由于要求对参数的保护,需要对输入参数或处理过程中的一些状态进行判断,判断程序能否/是否需要继续执行.在matl ...

  6. C++assert 断言

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105022662 C ...

  7. python assert断言的用法

    使用assert断言是学习python一个非常好的习惯,python assert 断言句语格式及用法很简单.在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件 ...

  8. 学习笔记(02):Python网络编程并发编程-assert断言的用途

    立即学习:https://edu.csdn.net/course/play/24458/296228?utm_source=blogtoedu 异常处理 1.异常的捕捉 try:正常需要运行的代码ex ...

  9. C++ ASSERT() 断言机制

    C++ ASSERT() 断言机制 ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行.如果表达式不为0,则继 ...

最新文章

  1. python paramiko 问题总结
  2. 梳理十年Kaggle竞赛,看自然语言处理的变迁史
  3. 武汉工程大学计算机学院吴云韬,吴兴隆-武汉工程大学计算机科学与工程学院...
  4. load、loads、dump、dumps的区别
  5. 四级单词pdf_2016年12月大学英语四级真题及答案解析(完整三套可打印)
  6. linux下mysql的启动与停止
  7. 你真的理解BIO、NIO、AIO的区别吗?
  8. 抗滑桩弹性计算方法_抗滑桩设计与计算99147
  9. Matlab中的逻辑运算与,||与|的区别
  10. 【eclipse】启动不了报错java was started but returned exit code=13
  11. 【笔记整理】数字信号处理复习——FT、DTFT、DFT和FFT之间的关系
  12. 阿里百川 用户反馈(feedback) 与 (com.umeng.lib.xxxxx 及 和 alipaySDK-xxxxx) 冲突的问题。
  13. 随笔--读书笔记《软技能:代码之外的生存指南》
  14. sql面试题,查询出每班每科最高分的学生
  15. oracle怎么确定安装成功,怎么判断oracle是否安装成功
  16. id门禁卡复制到手机_门禁卡复制到苹果手机
  17. IOCP之accept、AcceptEx、WSAAccept的区别 .
  18. TypeScript 基础数据类型与接口
  19. 快乐的牛奶商 c语言6,C语言程序设计基础实训手册
  20. Oracle PURGE子句清除回收站中的对象

热门文章

  1. 使用遗传算法解决图着色问题
  2. java mb单位转换_Java计算机硬盘大小转换(B,KB,MB,GB,TB,PB之间的大小转换)
  3. Android ViewModel
  4. aws cloud map_Amazon EC2 – AWS Elastic Compute Cloud
  5. 熊猫DataFrame groupby()函数
  6. 开课吧课堂:C++开发语言的应用方向有哪些?
  7. AGC002E(AtCoder1999) Candy Piles(博弈论)
  8. iis 创建应用程序池的方法与分析第3/3页
  9. 12_第一个Flutter程序
  10. Java编程思想学习录(连载之:初始化与清理)