我有一个在设备上运行的构建应用程序。我在XCode的管理器窗口中打开设备的控制台视图。我假设(为了这个问题)NSLog(@" Some string")被调用。
有没有办法,可能是设备或应用程序设置中的一个选项,会禁止此日志出现在控制台中?
编辑:我对用其他可以达到这种效果的解决方案替换NSLog不感兴趣。这个问题的目的是完全理解NSLog的功能。
答案 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)
答案 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”。
并且就是这样,您现在不会在控制台中看到任何日志。