是否可以禁止NSLog出现在设备的控制台中?

时间:2014-01-20 12:06:27

标签: ios xcode nslog

我有一个在设备上运行的构建应用程序。我在XCode的管理器窗口中打开设备的控制台视图。我假设(为了这个问题)NSLog(@" Some string")被调用。

有没有办法,可能是设备或应用程序设置中的一个选项,会禁止此日志出现在控制台中?

编辑:我对用其他可以达到这种效果的解决方案替换NSLog不感兴趣。这个问题的目的是完全理解NSLog的功能。

4 个答案:

答案 0 :(得分:1)

(感谢@MartinR鼓励我完全理解这个答案并正确识别你不能只关闭stdout / stderr,因为下一个open()将重用这些文件描述符,但是将stdout / stderr重定向到臭名昭着的/dev/null)。

logControl.h:

#pragma once

extern void stopLogging();
extern void startLogging();

logControl.c:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

static int loggingStopped = 0;
static int oldStdout = -1;
static int oldStderr = -1;

void stopLogging() {
    if (!loggingStopped) {
        oldStdout = dup(1);
        oldStderr = dup(2);

        int devNull = open("/dev/null", O_WRONLY);
        dup2(devNull, 1);
        dup2(devNull, 2);
        close(devNull);

        loggingStopped = 1;
    }
}

void startLogging() {
    if (loggingStopped && oldStdout >= 0 && oldStderr >= 0) {
        dup2(oldStdout, 1);
        close(oldStdout);
        oldStdout = -1;

        dup2(oldStderr, 2);
        close(oldStderr);
        oldStderr = -1;

        loggingStopped = 0;
    }
}

这适用于运行时,而不是编译时间,我相信这就是你所要求的。只需根据需要致电stopLogging()startLogging()

注意:没有错误检查,所以可能会改进。

答案 1 :(得分:0)

在Xcode的.pch文件中添加以下给出的这一行。

   #define NSLog(...)

它将禁用所有NSLog。

有关更多替代方案,请参阅link

答案 2 :(得分:0)

#if TARGET_IPHONE_SIMULATOR

//Simulator

#else

// Device
#define NSLog
#endif

.pch 文件中添加此内容,这将仅针对设备而非模拟器禁用NSLog

答案 3 :(得分:0)

将以下代码添加到.pch文件

#ifdef DEBUG
#    define NSLog(...) NSLog(__VA_ARGS__)
#else
#   define NSLog(...) /* */
#endif

在Build Settings中,搜索“Preprocessor Macros”并删除其中写的“DEBUG = 1”。

并且就是这样,您现在不会在控制台中看到任何日志。