Iphone 如果应用程序发生了不好的事情,例如不可恢复的错误,则禁用printf或NSLog。

Iphone 如果应用程序发生了不好的事情,例如不可恢复的错误,则禁用printf或NSLog。,iphone,objective-c,nslog,Iphone,Objective C,Nslog,从安全角度看,这取决于记录的内容。如果NSLog(或其他记录器)正在写入敏感信息,则应在生产代码中删除记录器 从审计的角度来看,审计师不希望查看NSLog的每次使用,以确保其不记录敏感信息。他/她会简单地告诉您移除记录器 我和这两个小组一起工作。我们审核代码、编写编码指南等。我们的指南要求在生产代码中禁用日志记录。所以内部团队知道不要尝试;) 我们还将拒绝登录生产的外部应用程序,因为我们不想接受与意外泄漏敏感信息相关的风险。我们不在乎开发者告诉我们什么。这根本不值得我们花时间去调查 记住,我们定

从安全角度看,这取决于记录的内容。如果
NSLog
(或其他记录器)正在写入敏感信息,则应在生产代码中删除记录器

从审计的角度来看,审计师不希望查看
NSLog
的每次使用,以确保其不记录敏感信息。他/她会简单地告诉您移除记录器

我和这两个小组一起工作。我们审核代码、编写编码指南等。我们的指南要求在生产代码中禁用日志记录。所以内部团队知道不要尝试;)

我们还将拒绝登录生产的外部应用程序,因为我们不想接受与意外泄漏敏感信息相关的风险。我们不在乎开发者告诉我们什么。这根本不值得我们花时间去调查

记住,我们定义的是“敏感”,而不是开发人员;)

我还认为一个执行大量日志记录的应用程序是一个准备崩溃的应用程序。执行/需要这么多日志记录是有原因的,而且通常不稳定。它就在上面有“看门狗”线程,可以重新启动挂起的服务


如果您从未进行过安全体系结构(SecArch)审查,我们将查看以下内容。

将这三行放在-prefix.pch文件的末尾:

#ifndef DEBUG
  #define NSLog(...) /* suppress NSLog when in release mode */
#endif

您不需要在项目中定义任何内容,因为在创建项目时,
DEBUG
默认情况下是在构建设置中定义的。

简单的事实是,NSLog非常慢

但是为什么呢?为了回答这个问题,让我们了解一下NSLog是做什么的,以及它是如何做的

NSLog到底做什么

NSLog做了两件事:

它将日志消息写入苹果系统日志(asl)设施。这允许日志消息显示在Console.app中。 它还检查应用程序的stderr流是否将发送到终端(例如,当应用程序通过Xcode运行时)。如果是这样,它会将日志消息写入stderr(以便它显示在Xcode控制台中)

给STDERR写信听起来并不难。这可以通过fprintf和stderr文件描述符引用来实现。但是asl呢

关于ASL,我找到的最好的文档是Peter Hosey的一篇10篇博文:

在不涉及太多细节的情况下,重点(因为它涉及性能)是:

要向ASL设施发送日志消息,基本上需要打开到ASL守护进程的客户端连接并发送消息。但是-每个线程必须使用单独的客户端连接。因此,为了线程安全,每次调用NSLog时,它都会打开一个新的asl客户端连接,发送消息,然后关闭连接


可以找到资源&。

请记住,nslog会降低UI/主线程的速度。除非绝对必要,否则最好将其从发布版本中删除。

我知道这个问题现在已经很老了,但是,如果您仍然可以,我会将Marc Charbonneau的答案标记为已接受。我已经修改了我的答案以指向他的答案,但他的答案是正确的。他说,频繁循环中的NSLog()绝对会扼杀你的表现,他发现了困难之路。优秀答案+1。我已经改变了我的观点,表明你的#define宏是一条可行的道路,我希望OP会转换接受的答案(我给他留下了一条评论)。我使用了一个虚拟函数,因为我不知道你可以使用。。。宏中的参数。生活与学习!这是一个很好的答案,不过我建议在“DEBUG_模式”定义中使用个人前缀,比如称之为“JPM_DEBUG”之类。我经常遇到第三方代码也使用DEBUG或DEBUG_模式或类似模式,有时这些代码在DEBUG模式下无法正常工作。如果要启用第三方库调试,则应有意这样做。(当然,它是图书馆的作家应该预先安装他们的符号,但许多C和C++框架不,特别是这个定义)。是否有一个XCODEL预定义的宏,可以用来打开这一点只有当配置被设置为调试?我不希望在每个项目中自己手动设置这个预处理器宏。如果XCODE_CONFIGURATION==DEBUG,我们是否可以执行类似以下伪代码的操作?#包含这种方法会导致编译器在发布模式下发出虚假的“未使用变量”警告,而日志记录语句仅用于计算要记录的值。如果你和我一样讨厌编译器警告,那么什么是避免这种情况的最聪明的方法呢?这是对这个问题的一个有价值的补充答案。值得多加评论。
DEBUG_模式
DEBUG_宏
都是非常规的。我在苹果的网站()上只找到了一个对调试宏的引用。也许更标准的
DEBUG
NDEBUG
会是更好的选择<代码>NDEBUG由Posix指定;虽然
DEBUG
是按惯例使用的。+1是的,这是一篇老文章,但这就是重点。。。在我的Xcode版本(4年后)中,搜索GCC_预处理器_定义会返回一些不同的语言。请考虑更新这个优秀的答案为Curr.Surry-遇到不专业的谁?谁可能会在发布的应用程序上查看你的日志,并据此判断你的专业水平?(明确地说,我完全同意您不应该在应用程序的发布版本中保留大量的NSLog,但我被“专业性”的论点弄糊涂了。)其他开发人员会对您正在做的事情感到恼火。Android有一个类似的问题,一些开发人员非常糟糕,应该考虑TestFlight向应用程序添加的开销。是否可以只添加TestFlight的日志部分?编辑文本。资源只需要在页脚中,这是目前为止最好的解决方案。你需要
// Target > Get Info > Build > GCC_PREPROCESSOR_DEFINITIONS
// Configuration = Release: <empty>
//               = Debug:   DEBUG_MODE=1
[DDLog addLogger:[DDASLLogger sharedInstance]];
[DDLog addLogger:[DDTTYLogger sharedInstance]];
#ifndef DEBUG
  #define NSLog(...) /* suppress NSLog when in release mode */
#endif