为什么断言只是终止为 iPhone 编译的程序?

2023-11-27

我正在调试一个经过大量断言()处理的 iPhone 应用程序(Xcode、Objective-C++ 和设备模拟器)。在某些情况下,断言失败只会终止应用程序,而不是像我期望的那样闯入调试器。

我通过实现我自己的断言来解决方法,其效果是:

#define AssertLite(b) if(!(b)) {asm {int 3}}

(废话省略),但我想知道是否有人遇到过这种情况。我无法确定它何时中断以及何时终止的模式。代码没有线程化;它所做的一切都是在事件处理程序中完成的。

为什么会发生这种情况以及如何使普通的断言()表现得像条件断点一样?


首先,由于您正在开发 iPhone 应用程序,因此您可能应该使用 NSAssert() 而不是普通的 BSD 断言函数。

e.g. NSAssert(the_object, @"NIL object encountered");

NSAssert 宏将抛出 Objective-C 异常(NSInternalInconsistencyException) 如果断言失败。

由于您的目标是在异常发生时中断,因此下一步是使 Xcode 调试器在 Objective-C 异常时中断。无论如何,这可能是一件好事。

在“断点”窗口(“运行”->“显示”->“断点”菜单项)中,单击显示“双击符号”的位置以输入符号-[NSException raise]

最后要小心的是 NSAssertsnot在发布版本中编译。这意味着您必须准备好处理应用程序中的异常,或者需要创建自己的宏来在发布版本中进行编译。

这是我用来在运行时代码中编译断言的宏(请注意,我随后在代码中使用 HMAssert 而不是 NSAssert):

#ifdef DEBUG
#   define HMAssert(A,B) NSAssert(A,B)
#else
#   define HMAssert(A,B)
#endif

这需要定义一个 DEBUG 预处理器宏。设置方法如下:

  1. 在 Xcode 中右键单击您的项目。这将是左侧面板中列出您的项目文件的顶部项目
  2. 从弹出的上下文菜单中选择“获取信息”。
  3. 转到“构建”选项卡。
  4. 确保“配置”设置为“调试”。
  5. 在“GCC 4.2 - 预处理”下“预处理器宏”旁边的字段中输入 DEBUG。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么断言只是终止为 iPhone 编译的程序? 的相关文章

随机推荐

  • ASP.NET MVC 4应用程序调用远程WebAPI

    我过去创建过几个 ASP NET MVC 应用程序 但以前从未使用过 WebAPI 我想知道如何创建一个简单的 MVC 4 应用程序 通过 WebAPI 而不是通过普通的 MVC 控制器来执行简单的 CRUD 操作 诀窍在于 WebAPI
  • Sharepoint API - 如何从 ASP.NET Web 应用程序将文件上传到 Sharepoint 文档库

    我是 Sharepoint Server 的新手 我们有任何实用程序可以从 ASP NET 应用程序上传文件吗 您能提供您宝贵的答案吗 您可以编写一些自定义代码来执行此操作 如果您位于同一服务器上或使用 Web 服务 则可以使用 Share
  • 是否可以转换参数包中的类型?

    是否可以转换参数包的类型并传递 例如 鉴于以下情况 template
  • 不存在具有键“xxx”的“IEnumerable”类型的 ViewData 项

    Stack Overflow 上有几篇关于此问题的帖子 但没有一个答案似乎可以解决我当前情况下的问题 我有一个页面 其中有一个表格 每行都有多个文本字段和一个下拉列表 所有下拉列表都需要使用相同的 SelectList 数据 因此我将其设置
  • 在共享主机上为 32 位 Linux 编译 git

    我需要在廉价的共享主机上设置 Git 客户端 并使用一个不知名的 32 位 Linux 发行版 GCC 不可用 所以我无法在服务器上编译它 我确实有两台其他 64 位 Linux 服务器和一台 OSX 笔记本电脑可供使用 我可以尝试在其上交
  • Gnuplot,如何*跳过*丢失的数据文件?

    根据各种因素 我可能没有 1 个或多个不存在的数据文件 在预定义的 gnuplot 绘图指令中引用 当这种情况我得到 警告 跳过不可读的文件 这会取消其余指令 有什么方法可以让 gnuplot 跳过任何丢失的数据文件并绘制所有现有的数据文件
  • 为什么我收到“错误:无法推送某些参考”?

    我有一个远程 git 存储库和一个我使用的本地存储库 每当我在本地进行任何更改时 我都会将它们推送到远程 然后我有时会在远程文件上执行 git commit 以存储远程文件上的更改 我根本不直接编辑远程存储库 我只是提交更改 我是一名单一开
  • Android堆碎片策略?

    我有一个 OpenGL Android 应用程序 它使用大量内存来设置复杂的场景 这显然会导致严重的堆碎片 即使不存在内存泄漏 也不可能在不因碎片而耗尽内存的情况下销毁和创建应用程序 碎片肯定是问题 而不是泄漏 这会导致一个主要问题 因为
  • python 3.x ImportError:没有名为“cStringIO”的模块

    我该如何解决ImportError No module named cStringIO 在Python 3 x下 来自 Python 3 0 变更日志 StringIO 和 cStringIO 模块消失了 相反 导入 io 模块并分别使用
  • 如何在嵌套 Backbone 集合上“冒泡”事件?

    我有一个 Backbone 应用程序使用嵌套集合 至少我认为他们是这样称呼的 在我的具体情况下有tabs and subtabs 每个选项卡 模型 包含子选项卡 模型 的集合 对于那些更熟悉代码的人 我将在下面写下我的模型和集合 以及子选项
  • 在 OS X Mavericks 中从 C++ 链接 C

    转换到 OS X Mavericks 和 XCode 5 0 1 后 我无法再将已编译的 C 文件 从 gcc 输出 正常链接到 C 项目 从 g 输出 从我的 makefile 生成的有问题的命令对是 gcc pkg config cfl
  • Bootstrap 3 像 Facebook 一样的 Canvas 侧边栏菜单

    我正在使用 Bootstrap 3 的一些示例作为移动设备上的画布外侧边栏菜单 如下所示 http jsfiddle net AllenDB 9aAjJ 我将如何调整画布外菜单 使其像 Facebook 的搜索 朋友在线画布外菜单一样 始终
  • 用于任意大数的 BCD 数学库?

    我正在寻找库存 Delphi Data FmtBcd 库的替代品 因为我刚刚达到了它的限制 例如它可以表示的最大十进制数字 并且程序以以下方式终止EBcd 溢出异常 出于好奇 我正在计算算术系列成员 并且需要处理非常大的数字 数十万个位置并
  • 浏览器什么时候开始渲染部分传输的 HTML?

    我有一个长期运行的报告 并希望在生成报告时向用户显示一个等待旋转器 我已经完成了这项工作 但不确定我是否以最好或正确的方式做这件事 这是使用 ColdFusion 但我猜它可以是任何语言 在页面顶部 我有一些 Javascript jQue
  • Java继承字段[重复]

    这个问题在这里已经有答案了 我无法理解以下输出 我不知道为什么输出是 10 我认为该行A a new B 创建B类的新实例 我认为结果应该是20 class A int i 10 class B extends A int i 20 pub
  • 强制重新验证 mvc3 非侵入式远程验证

    这是一个经典的登录流程 用户可以选择 新用户 或 现有用户 如果用户是新用户 则登录框中的名称应根据服务器进行验证 以查看用户名是否唯一 如果是现有用户 则将跳过此检查 因为我们希望用户名已被使用 当然 我在视图模型上添加了一个 Remot
  • Objective-C 中的回合双打

    我有两个数字 格式如下34 123456789 如何将其更改为 34 123 我只想要小数点后 3 位数字 您可以将其打印到小数点后三位 NSString stringWithFormat 3f d 您可以将其近似舍入round d 100
  • 当元素位于视口中时jquery触发函数

    我想在 jquery localscroll 到达文档的某个点 div 时触发一个事件 假设我们从顶部 div 垂直滚动到第三个 div 当它到达那里时 就会触发该操作 jQuery 航点插件http imakewebthings gith
  • Android EPUBLIB 读取/加载内容

    我正在玩http www siegmann nl epublib在安卓上 有人可以解释一下正确的方法吗 阅读 epub HTML 内容 如何在 Android 上显示它 使用 WebView 如何将内容拆分为页面以及 如何搜索内容 Thx
  • 为什么断言只是终止为 iPhone 编译的程序?

    我正在调试一个经过大量断言 处理的 iPhone 应用程序 Xcode Objective C 和设备模拟器 在某些情况下 断言失败只会终止应用程序 而不是像我期望的那样闯入调试器 我通过实现我自己的断言来解决方法 其效果是 define