Objective-C中的NS_BLOCK_ASSERTIONS
我正在iPhone应用程序中使用NSAssert()调用,我从Apple文档中了解到,如果定义了NS_BLOCK_ASSERTIONS,则断言不会编译到代码中。
要closures声明,在头文件中我声明:#define NS_BLOCK_ASSERTIONS
但是,assert代码似乎仍然运行。
有什么我在这里失踪?
谢谢
约翰
如果您基于其中一个标准模板创build了Xcode项目,则Cocoa头文件(包括NSAssert
macros包含的NSException.h
)将在项目中的任何其他文件之前进行预处理。 任何项目的头文件或实现文件中的#define NS_BLOCK_ASSERTIONS
都不会影响NSAssert
macros。
尝试将NS_BLOCK_ASSERTIONS
放入目标的预处理器macros,甚至是项目(仅用于发布configuration):
或者在#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
,可以在外部使用。
希望能帮助一些人;-)