最近我读了两条非常有趣的建议:

  1. 在对this StackOverflow answer的 comments 中,@Mike Weller说在生产代码中保留您的断言...什么是表演热门,真的吗?有什么理由不把它们留在家里吗?
  2. Vincent Gable's blog中,他说你应该更喜欢assert而不是NSAssert...有什么理由不使用assert吗?(少了几个字母:))

推荐答案

回答两个问题:

  1. 除非断言中的实际操作非常耗时(例如assert([obj calculateMeaningOfLife] == 42)),否则在断言中离开应该不会对性能造成太大影响.就性能而言,断言应该与额外的if语句没有什么不同.在发布版本中剥离断言的原因是,它们本质上是一种调试工具——它们在运行时捕获不一致的内部程序状态.从开发人员的Angular 来看,一个应用程序一旦出现问题就崩溃要好得多,但从用户的Angular 来看,如果应用程序不崩溃(除非让应用程序在异常状态下运行会导致可怕的事情发生),那么可以说不那么恼人,并且在错误消息中expose 开发细节可能会令人不快.双方都有很好的论据——如果我没记错的话,Code Complete建议go 掉它们,而The Pragmatic Programmer建议保留它们.在任何情况下,断言都不能代替正确的错误处理,只能用于编程错误.

  2. NSAssert和普通assert的基本区别在于,当NSAssert失败时会引发异常,而assert只是使应用程序崩溃.NSAssert还允许您提供更有趣的错误消息并记录它们.实际上,我真的不认为两者之间有太大区别——我想不出处理断言引发的异常的理由.(我认为NSAssert通常需要更少的打字,因为你不必包括assert.h,但这既不重要也不重要.)

Objective-c相关问答推荐

在 MacOS 上截屏

Objective c 判断文本字段是否为空

Objective C 布尔数组

如何通过仅更改高度而不更改宽度来调整 UILabel 的大小?

Objective-c中release和dealloc的区别

self.ivar 和 ivar 之间的区别?

将长按手势和拖动手势结合在一起

处理 ARC 中的指针对指针所有权问题

NSFileManager 唯一的文件名

Objective-C:集合枚举块中的 continue继续?

Facebook 的 UIActivityViewController 不显示默认文本

NSManagedObjectContext performBlockAndWait:不在后台线程上执行?

Objective C 静态类变量

iOS 7 状态栏与 NavigationBar 冲突

xcode storyboard Container View - 如何访问视图控制器

如何在 iOS 上将图像旋转 90 度?

iPhone - 时区便利方法之间的差异

从昨天开始无法将存档上传到应用store

如何将小时数添加到 NSDate?

滑动删除单元格导致 tableView 标题随单元格移动