【发布时间】:2011-09-20 16:10:40
【问题描述】:
我在 iPhone 应用程序中使用 NSAssert() 调用,我对 Apple 文档的理解是,如果定义了 NS_BLOCK_ASSERTIONS,则断言不会编译到代码中。
要关闭断言,我在头文件中声明:#define NS_BLOCK_ASSERTIONS
但是,断言代码似乎仍在运行。
这里有什么我遗漏的吗?
谢谢
约翰
【问题讨论】:
标签: iphone objective-c xcode debugging
我在 iPhone 应用程序中使用 NSAssert() 调用,我对 Apple 文档的理解是,如果定义了 NS_BLOCK_ASSERTIONS,则断言不会编译到代码中。
要关闭断言,我在头文件中声明:#define NS_BLOCK_ASSERTIONS
但是,断言代码似乎仍在运行。
这里有什么我遗漏的吗?
谢谢
约翰
【问题讨论】:
标签: iphone objective-c xcode debugging
正如@dwsolberg 提到的,Xcode 有一个名为ENABLE_NS_ASSERTIONS 的新构建设置。对于新项目,其发布配置的值设置为NO,所有其他配置的值设置为YES。您可以使用此设置以及广泛使用的 NS_BLOCK_ASSERTIONS 方法,该方法在 Xcode 6 中仍然有效。
断言是一种在开发期间跟踪错误的工具,绝不应该在生产代码中触发!此外,只有在绝对必要的情况下才应使用异常,即如果出现了该死的错误以至于程序无法继续执行。 Cocoa 的方式是给关键方法一个布尔返回值,并用一个错误对象对其进行参数化,该错误对象可以在方法内部设置,如果返回值为NO,则可以在外部使用。
希望对一些人有所帮助;-)
【讨论】:
如果您基于标准模板之一创建了 Xcode 项目,那么 Cocoa 标头(包括包含 NSAssert 宏的 NSException.h)将在项目中的任何其他文件之前进行预处理。因此,任何项目的头文件或实现文件中的#define NS_BLOCK_ASSERTIONS 对NSAssert 宏都没有影响。
尝试将NS_BLOCK_ASSERTIONS 放入目标甚至项目的预处理器宏中(仅用于发布配置):
或者将#define NS_BLOCK_ASSERTIONS 放在#import <Cocoa/Cocoa.h> 或#import <Foundation/Foundation.h> 行之前的前缀(.pch) 标头中。
【讨论】: