Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone Objective-C中的NS_BLOCK_断言_Iphone_Objective C_Xcode_Debugging - Fatal编程技术网

Iphone Objective-C中的NS_BLOCK_断言

Iphone Objective-C中的NS_BLOCK_断言,iphone,objective-c,xcode,debugging,Iphone,Objective C,Xcode,Debugging,我在iPhone应用程序中使用NSAssert()调用,我从Apple文档中了解到,如果定义了NS_BLOCK_断言,则断言不会编译到代码中 要关闭断言,我在头文件中声明:#define NS_BLOCK_断言 但是,断言代码似乎仍在运行 这里有我遗漏的东西吗 谢谢 John如果您基于标准模板之一创建了Xcode项目,则Cocoa头(包括NSException.h,其中包含NSAssert宏)将在项目中的任何其他文件之前进行预处理。因此,在任何项目的头文件或实现文件中定义NS_BLOCK_断言,

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

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

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

这里有我遗漏的东西吗

谢谢


John

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

尝试将
NS\u BLOCK\u断言
放入目标甚至项目的预处理器宏中(仅适用于版本配置):


或者将
#define NS_BLOCK_断言
放在
#import
#import
行之前的前缀(.pch)头中。

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

断言是一种在开发期间跟踪bug的工具,决不能在生产代码中触发!此外,只有在绝对必要的情况下才应使用异常,即,如果出现了非常严重的错误,程序无法继续执行。Cocoa方法是给关键方法一个布尔返回值,并使用一个错误对象对其进行参数化,该对象可以在方法内部设置,如果返回值为
NO
,则可以在外部使用


希望这能帮助一些人;-)

请注意,在Xcode 4.2中,模板已经为您设置好了:断言在发布版本中被阻止。我认为它再次被更改。在XCODE 5中,Bug设置下的处理区域包含一个名为“启用基础断言”的部分,缺省值用于所有的构建配置:AdHoc、调试和发布。在XCuff5.0.2中,对于默认版本的发布构建禁用了断言。h仍然使用NS_BLOCK_断言。请看我将要评论的问题,为什么不应该在生产代码中使用断言?这就像允许无声的数据损坏而不是崩溃!如果开发人员误用了我的库API,它应该崩溃,这样他就可以修复它-调试或发布。断言有什么特别之处,应该在生产中禁用,但允许其他运行时异常?应用程序不应该崩溃,它应该优雅地处理错误,捕获错误,显示错误,并另外通知错误跟踪系统。对于图书馆来说也是如此。您可以发布lib的调试版本和发布版本。永远不要让你的应用程序崩溃,因为应用程序处于未定义状态,所以无法显示可恢复的错误。再也不可能继续执行了。我在6年的iOS开发中从未出现过这样的错误,这并不意味着不可能发生这样的事情。但在这种情况下,你应该过度思考你的应用程序设计,并在视图层次结构的更高(或最高)级别上显示错误。崩溃是你的应用程序可能发生的最糟糕的事情!很抱歉,这完全是错误的。如果您错过了一个空指针断言,并且向一个nil对象发送消息,并且假设一切都正常,会发生什么?结果可能是用户数据损坏。你似乎不理解“未定义状态”的概念。应用程序无法恢复,并且无法显示任何有意义的错误。这相当于一个编程错误。这就像试图终止挂起的工作线程。一旦终止线程,堆栈将未定义,应用程序必须崩溃,无论主线程是否正常工作。除非后台线程正常返回,否则无法从中恢复。