学习计划iOS 开发 iOS Developer

iOS-NSParameterAssert总结

2016-06-08  本文已影响2103人  船长_

一.NSParameterAssert官方解释

Assertions evaluate a condition and, if the condition evaluates to false, call the assertion handler for the current thread, passing it a format string and a variable number of arguments. Each thread has its own assertion handler, which is an object of classNSAssertionHandler.
When invoked, an assertion handler prints an error message that includes method and class names (or the function name). It then raises anNSInternalInconsistencyException exception.
断言评估一个条件,如果条件为 false ,调用当前线程的断点句柄。每一个线程有它自已的断点句柄,它是一个 NSAsserttionHandler 类的对象。当被调用时,断言句柄打印一个错误信息,该条信息中包含了方法名、类名或函数名。然后,它就抛出一个 NSInternalInconsistencyException 异常。

This macro validates a parameter for an Objective-C method. Simply provide the parameter as the condition argument. The macro evaluates the parameter and, if it is false, it logs an error message that includes the parameter and then raises an exception.
这个宏用于确认一个 Objective-C 的方法的有效性。简单提供参数作为条件就行。该宏评估这个参数,如果为 false ,它就打印一个错误日志信息,该信息包含了参数并且抛出一个异常。

Assertions are disabled if the preprocessor macro NS_BLOCK_ASSERTIONS is defined. All assertion macros return void.
如果定义了预处理宏 NS_BLOCK_ASSERTIONS 断言就被禁止了。所有的断点宏都返回 void。

二.原理

三.延伸

基础类库中定义了两套断言宏:
NSAssert / NSCAssert
NSParameterAssert / NSCParameterAssert

基础类库从语义学上和功能性上使断言处理器的 API 在两个方面区别开来。

值得注意的是,从 Xcode 4.2 开始,发布构建默认关闭了断言,它是通过定义 NS_BLOCK_ASSERTIONS 宏实现的。也就是说,当编译发布版时,任何调用 NSAssert 等的地方都被有效的移除了。

四.断言代码示例

方法一.一般断言,我们可以这么写

if (_menuController == nil || _mainController == nil) {
        @throw [NSException exceptionWithName: @"LXDNullInstanceException" reason: @"you can not slide view when one or more of menu view and main view is nil" userInfo: nil];
 }

// 如果其中一个条件成立,程序崩溃,报下面的错

//  *** Terminating app due to uncaught exception 'LXDNullInstanceException', 
reason: 'you can not slide view when one or more of menu view and main view is nil'

方法二:NSAssert

 NSAssert(_menuController != nil , @"you can not slide view when one or more of menu view and main view is nil" );
// 方法名   m:118行   报错描述
// *** Assertion failure in -[LXDSlideManager open], /Users/mac/Downloads/LXDSlideManager.m:118
2016-05-29 17:47:53.655 
LXDSlideMenuObjectiveC[77358:4074358] 
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException',
reason: 'you can not slide view when one or more of menu view and main view is nil'

方法三: NSParameterAssert

NSParameterAssert((_menuController != nil));
// 方法名   m:118行   报错描述
// *** Assertion failure in -[LXDSlideManager open], /Users/mac/Downloads/LXDSlideManager.m:118
2016-05-29 17:47:53.655 
LXDSlideMenuObjectiveC[77358:4074358] 
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException',
reason: 'you can not slide view when one or more of menu view and main view is nil'

注意条件书写不支持逻辑或语法

// 错误写法,不支持逻辑或语法
NSParameterAssert(_menuController != nil || _mainController != nil);
// 错误写法,不支持逻辑或语法
 NSAssert(_menuController != nil || _mainController != nil , @"you can not slide view when one or more of menu view and main view is nil" );

参考原文 http://nshipster.cn/nsassertionhandler/

上一篇下一篇

猜你喜欢

热点阅读