Objective-C中的NS_BLOCK_ASSERTIONS

Joh*_*how 37 iphone debugging xcode objective-c

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

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

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

这里有什么我想念的吗?

谢谢

约翰

puz*_*zle 61

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

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

GCC_PREPROCESSOR_DEFINITIONS = NS_BLOCK_ASSERTIONS

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

  • 请注意,在Xcode 4.2中,模板已经为您设置了:在发布版本中阻止了断言. (13认同)
  • 我想它已经被改变了.在Xcode 5.0中,构建设置下的处理区域包含一个名为"Enable Foundation Assertions"的部分,并且默认设置为所有构建配置启用:AdHoc,Debug和Release. (5认同)

bla*_*acx 13

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

预处理器宏方法

基础断言构建设置

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

希望能帮助一些人;-)