受2013年5月3日周五问答:正确使用Asserts的启发,我创建了这些宏来处理我的断言。
注意:我不会禁用发布代码中的断言。我同意Mike Ash的观点,如果有问题,应该立即崩溃。
受Krzysztof Zabłocki的博客文章的启发,FCYAssertOrReturn
系列的宏只在调试模式下崩溃,在生产构建时不会。为什么?一个应用不应该因为外部更改而崩溃。
重要注释:与NSAssert
一样,FCYAssertOrReturn
使用NS_BLOCK_ASSERTIONS
。
FCYAssert
,如果您可以控制调用代码;FCYAssertOrReturn
,如果您正在断言外部代码,例如,如果JSON的根元素是NSDictionary。只需将FCYAsserts
中的文件添加到项目中,并在前缀头文件(`*.pch`)或每个您想要的`*.m`中导入FCYAsserts.h
。
用法与NSAssert完全一样,不同之处在于日志更完整。
// AppDelegate.m
#import "FCYAsserts.h"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[self startLengthyOperation];
// ...
}
- (void)startLengthyOperation {
FCYAssertIsNotInMainThread;
// ...
}
默认使用`NSLog`,将使用以下日志断言:
-[TPAppDelegate startLengthyOperation]: 断言 '
NSError *error;
id json = [NSJSONSerialization JSONObjectWithData:dataFromServer options:0 error:&error];
if (error) {
completionBlock(nil, error);
} else {
FCYAssertOrReturnBlock([json isKindOfClass:[NSDictionary class]], @"Invalid Server Data", ^(NSError *assertError){
completionBlock(nil, assertError);
});
completionBlock(json, nil);
}
如果json在调试代码中不是NSDictionary,将断言并记录,在生产代码中仅记录。
-[MyClass callServiceWithCompletionBlock:]: 断言 '[json isKindOfClass:[NSDictionary class]]' 在文件《/Users/you/dev/Project/MyClass.m》的第42行失败。无效的服务数据。
如果您使用CocoaLumberjack,您可以通过定义FCYAssertLog
使FCYAsserts使用它。
#import "FCYAsserts.h"
#define FCYAssertLog DDLogError
使用CocoaLumberjack,您可以将日志保存到文件,还可以做更多的事情。这对支持请求非常有用,您可以在用户从您的应用程序发送支持请求时附加日志。
而且比 NSLog
更 快。
享受吧!
(MIT许可证)
版权所有 © 2013 Felipe Cypriano
在此特此授予任何获取本软件和相关文档副本(统称为“软件”)的人士,免许可费的权限,可以在不受限制的情况下处理该软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可并/或销售软件副本,并允许向软件提供服务的人员执行此类操作,但必须遵守以下条件
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
软件按“原样”提供,不提供任何保证,无论是明示的还是隐含的,包括但不限于对适销性、特定目的的适用性和非侵权的保证。在任何情况下,作者或版权所有者均不对任何主张、损害或其他责任负责,无论该主张、损害或其他责任是由合同行为、侵权行为或其他行为引起的,与软件有关,或在使用或以其他方式使用软件有关。