Objective-C中的NS_BLOCK_ASSERTIONS

时间:2011-06-22 19:11:37

标签: iphone objective-c xcode debugging

我在iPhone应用程序中使用NSAssert()调用,而我对Apple文档的理解是,如果定义了NS_BLOCK_ASSERTIONS,则断言不会编译到代码中。

要关闭断言,请在头文件中声明:#define NS_BLOCK_ASSERTIONS

但是,断言代码似乎仍在运行。

我在这里缺少什么?

由于

约翰

2 个答案:

答案 0 :(得分:60)

如果您基于其中一个标准模板创建了Xcode项目,那么Cocoa标头(包括NSException.h包含NSAssert宏)将在项目中的任何其他文件之前进行预处理。因此,项目的任何标头或实现文件中的#define NS_BLOCK_ASSERTIONSNSAssert宏没有影响。

尝试将NS_BLOCK_ASSERTIONS放入目标甚至项目的预处理器宏中(仅适用于发布配置):

GCC_PREPROCESSOR_DEFINITIONS = NS_BLOCK_ASSERTIONS

或者将#define NS_BLOCK_ASSERTIONS放入#import <Cocoa/Cocoa.h>#import <Foundation/Foundation.h>行之前的前缀(.pch)标题中。

答案 1 :(得分:13)

正如@dwsolberg所提到的,Xcode有一个名为ENABLE_NS_ASSERTIONS的新构建设置。对于新项目,其发布配置的值设置为NO,而所有其他配置的值设置为YES。您可以使用此设置以及广泛使用的NS_BLOCK_ASSERTIONS方法,该方法在Xcode 6中仍然有效。

Preprocessor Macro Approach

Foundation Assertion Build Setting

断言是一种在开发期间跟踪错误的工具,绝不应该在生产代码中激活!此外,只有在绝对必要的情况下才应使用例外情况,即如果某些事情如此糟糕以至于程序无法继续执行。 Cocoa方法是为关键方法提供布尔返回值,并使用可在方法内设置的错误对象对其进行参数化,如果返回值为NO,则可在外部使用。

希望能帮助一些人; - )