Objective-C中的NS_BLOCK_ASSERTIONS

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

要closures声明,在头文件中我声明:#define NS_BLOCK_ASSERTIONS

但是,assert代码似乎仍然运行。

有什么我在这里失踪?

谢谢

约翰

如果您基于其中一个标准模板创build了Xcode项目,则Cocoa头文件(包括NSAssertmacros包含的NSException.h )将在项目中的任何其他文件之前进行预处理。 任何项目的头文件或实现文件中的#define NS_BLOCK_ASSERTIONS都不会影响NSAssertmacros。

尝试将NS_BLOCK_ASSERTIONS放入目标的预处理器macros,甚至是项目(仅用于发布configuration):

GCC_PREPROCESSOR_DEFINITIONS = NS_BLOCK_ASSERTIONS

或者在#import <Cocoa/Cocoa.h>#import <Foundation/Foundation.h>行之前放置#define NS_BLOCK_ASSERTIONS到前缀(.pch)头文件中。

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

预处理器宏方法

基金会声明建立设置

断言是在开发过程中跟踪错误的一种工具,不应该在高效的代码中触发! 而且,只有在绝对必要的情况下才应该使用例外,即如果某个程序错误地导致程序无法继续执行。 Cocoa的方法是给关键方法一个布尔返回值,并用一个可以在方法内部设置的错误对象对它们进行参数化,如果返回值为NO ,可以在外部使用。

希望能帮助一些人;-)