ios之断言更胜于NSLog

有时候我们需要不断的输出以用来调试程序,断言这个东西很少被人用到。今天看网上一大神写的代码

NSAssert(!gMenu, @"singleton object");
NSParameterAssert(view);

便查了下文档

#define NSParameterAssert(condition) NSAssert((condition), @"Invalid parameter not satisfying: %s", #condition)
#if !defined(_NSAssertBody)
#define NSAssert(condition, desc, ...)	    do {					__PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS 	if (!(condition)) {			    [[NSAssertionHandler currentHandler] handleFailureInMethod:_cmd 		object:self file:[NSString stringWithUTF8String:__FILE__] 	    	lineNumber:__LINE__ description:(desc), ##__VA_ARGS__]; 	}				        __PRAGMA_POP_NO_EXTRA_ARG_WARNINGS     } while(0)
#endif

本质还是NSAssert。

第一个参数为一个条件判断,如果为假,则抛出异常,显示第二个参数所描述的信息。

举个例子:

    NSInteger a = 5;
    NSInteger b = 0;
    NSInteger c = 0;
    // 断言
    NSAssert(b!=0, @"b 是 零");

只有在debug下,会导致crash,并在系统中显示:

2014-07-23 13:43:33.465 CatchCrash[8747:60b] *** Terminating app due to uncaught exception ‘NSInternalInconsistencyException‘, reason: ‘b 是 零‘
*** First throw call stack:
(
	0   CoreFoundation                      0x0000000101947495 __exceptionPreprocess + 165
	1   libobjc.A.dylib                     0x00000001016a699e objc_exception_throw + 43
	2   CoreFoundation                      0x000000010194731a +[NSException raise:format:arguments:] + 106
	3   Foundation                          0x0000000101242f19 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 189
	4   CatchCrash                          0x0000000100001850 -[ViewController viewDidLoad] + 1056
	5   UIKit                               0x000000010034959e -[UIViewController loadViewIfRequired] + 562
	6   UIKit                               0x0000000100349777 -[UIViewController view] + 29
	7   UIKit                               0x000000010028996b -[UIWindow addRootViewControllerViewIfPossible] + 58
	8   UIKit                               0x0000000100289c70 -[UIWindow _setHidden:forced:] + 282
	9   UIKit                               0x0000000111039d73 -[UIWindowAccessibility(SafeCategory) _orderFrontWithoutMakingKey] + 68
	10  UIKit                               0x0000000100292ffa -[UIWindow makeKeyAndVisible] + 51
	11  UIKit                               0x000000010024ec98 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1788
	12  UIKit                               0x0000000100252a0c -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 660
	13  UIKit                               0x0000000100263d4c -[UIApplication handleEvent:withNewEvent:] + 3189
	14  UIKit                               0x0000000100264216 -[UIApplication sendEvent:] + 79
	15  UIKit                               0x0000000100254086 _UIApplicationHandleEvent + 578
	16  GraphicsServices                    0x0000000103ac071a _PurpleEventCallback + 762
	17  GraphicsServices                    0x0000000103ac01e1 PurpleEventCallback + 35
	18  CoreFoundation                      0x00000001018c9679 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 41
	19  CoreFoundation                      0x00000001018c944e __CFRunLoopDoSource1 + 478
	20  CoreFoundation                      0x00000001018f2903 __CFRunLoopRun + 1939
	21  CoreFoundation                      0x00000001018f1d83 CFRunLoopRunSpecific + 467
	22  UIKit                               0x00000001002522e1 -[UIApplication _run] + 609
	23  UIKit                               0x0000000100253e33 UIApplicationMain + 1010
	24  CatchCrash                          0x0000000100001c47 main + 103
	25  libdyld.dylib                       0x0000000101fdf5fd start + 1
	26  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)

上面代码区第一行少了一些字符串,在下面重新写了下。就是写出了crash的原因

*** Terminating app due to uncaught exception ‘NSInternalInconsistencyException‘, reason: ‘b

*** First throw call stack:


ios之断言更胜于NSLog

时间: 2024-08-28 16:43:44

ios之断言更胜于NSLog的相关文章

iOS自定义输出日志,取代NSLog

在pch文件中: #ifdef DEBUG #define ZSLog(...) NSLog(__VA_ARGS__) #else #define ZSLog(...) #endif

iOS开发debug跟release版本NSLog屏蔽方法

简单介绍以下几个宏: 1) __VA_ARGS__ 是一个可变参数的宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持).宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉,否则会编译出错. 2) __FILE__ 宏在预编译时会替换成当前的源文件名 3) __LINE__宏在预编译时会替换成当前的行号 4) __FUNCTION__宏在预编译时会替换成当前的函数名称 1. 在***-Prefix.pch里

IOS利用宏自定义输出(NSLog)

前言: 1)输出日志是会大量损耗系统性能 2)输出的信息很容易会被截取到,导致信息不安全. 所以我们会在发行版(Release)取消所有的Log.如果一行一行地去注释掉Log,显然不是一个明确的选择. 因此我们可以使用宏去自定义Log输出. 最简单的一个例子: #ifdef DEBUG # define GCLog(fmt, ...) NSLog((fmt), ##__VA_ARGS__); #else # define GCLog(...); #endif 使用方法: GCLog(@"sdf&

iOS 程序在UITextView中显示NSLog日志的方法,

最近开发程序,需要做个给测试人员的demo,客户端可以实时 显示程序的打印日志的功能, 查找了很多的资料找到个方法,利用NSPipe即可以实现, 苹果官方解释: objects provide an object-oriented interface for accessing pipes. An NSPipe object represents both ends of a pipe and enables communication through the pipe. A pipe is a

iOS 开发者必不可少的75个工具

原文出处: Ben Scheirman 译文出处: Njuxjy 如果你去到一位熟练的木匠的工作室,你总是能发现他/她有一堆工具来完成不同的任务. 软件开发同样如此.你可以从软件开发者如何使用工具中看出他水准如何.有经验的开发者精于使用工具.对你目前所使用的工具不断研究,同时了解一些替代品的使用,当你目前所用的工具无法满足你的需要时可以填补空缺. 记住了这些,我将向你展示一份关于各种工具的长长的列表.其中一些我每天都用,其他的我看情况使用.如果你还有更多的工具想展示在这个列表里,可以跟我留言哦亲

ios 75个工具

如果你去到一位熟练的木匠的工作室,你总是能发现他/她有一堆工具来完成不同的任务. 软件开发同样如此.你可以从软件开发者如何使用工具中看出他水准如何.有经验的开发者精于使用工具.对你目前所使用的工具不断研究,同时了解一些替代品的使用,当你目前所用的工具无法满足你的需要时可以填补空缺. 记住了这些,我将向你展示一份关于各种工具的长长的列表.其中一些我每天都用,其他的我看情况使用.如果你还有更多的工具想展示在这个列表里,可以跟我留言哦亲. 我尽我所能给列表分分类.有一些是网站,有些是后台服务,但大多数

iOS 优化内存(六)开发必不可少的75个工具

iOS 开发者必不可少的 75 个工具 如果你去到一位熟练的木匠的工作室,你总是能发现他/她有一堆工具来完成不同的任务. 软件开发同样如此.你可以从软件开发者如何使用工具中看出他水准如何.有经验的开发者精于使用工具.对你目前所使用的工具不断研究,同时了解一些替代品的使用,当你目前所用的工具无法满足你的需要时可以填补空缺. 记住了这些,我将向你展示一份关于各种工具的长长的列表.其中一些我每天都用,其他的我看情况使用.如果你还有更多的工具想展示在这个列表里,可以跟我留言哦亲. 我尽我所能给列表分分类

iOS 开发者必不可少的 75 个工具

转自http://blog.jobbole.com/46799/ iOS开发者有价值的工具集(15个)  http://www.open-open.com/lib/view/open1394458656676.html 灵感 pttrns - 一个很棒的按任务分类的iOS屏幕设计图库.举例来说,如果你想看其他应用如何处理活动feed,在这儿你可以找到一堆的例子. TappGala - 另一个很棒的优美应用设计的集合站.它不是按任务来分类的,只是一个优秀应用的列表,你可以在此获取灵感. Cocoa

[iOS、Unity、Android] 浅谈闭包的使用方法

前言 我们经常所编程语言的的进步速度是落后于硬件的发展速度的. 但是最近几年,闭包语法在各个语言中都有自己的体现形式,例如 • C语言中使用函数指针作为回调函数的入口: • Java和C#语言中的Lambda语法表达式; • Objective-C语言中的Blocks语法; • C#语言中的Delegates语法; • C++语言中的Functions对象; 历史 Peter J. Landin 在1964年将术语 闭包 定义为一种包含 环境成分 和 控制成分 的实体,用于在他的SECD 机器上