2014-01-20 6 views
-3

У меня есть встроенное приложение, которое работает на устройстве. Я открываю консольный вид устройства в окне организатора XCode. Я предполагаю (ради этого вопроса), что NSLog (@ «Некоторая строка») вызывается.Может ли NSLog быть отключенным от появления на консоли устройства?

Есть ли способ, может быть вариант в устройстве или в настройках приложения, которые могли бы отключить этот журнал, появляющийся в консоли?

Редактировать: Я не заинтересован в замене NSLog другим решением, которое может достичь этого эффекта. Цель этого вопроса - полностью понять функциональность NSLog.

+2

Поиск google для Objective-C DLog. – Wain

+0

@Wain это было бы полезно, если целью моего вопроса было достижение этого эффекта - скрыть NSLogs с консоли. Это не. –

+0

Вот что он делает. Сам NSLog не предлагает никаких параметров, поэтому вам нужна обертка вокруг него, чтобы вы могли отключать журналы по требованию или для сборки релиза. – Wain

ответ

0

Добавьте эту строку, указанную ниже, в ваш .pch-файл в Xcode.

#define NSLog(...) 

Он отключит все NSLogs.

для более альтернатив см link

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() при необходимости.

ПРИМЕЧАНИЕ. Ошибки, о которых можно говорить, нет.

+0

Лучше использовать dup2() для «перенаправления» stderr в/dev/null. В противном случае следующий открытый файл будет повторно использовать эти файловые дескрипторы.См. Http://stackoverflow.com/a/12611692/1187415 для примера. –

+0

@MartinR Да, я думаю, вы правы. Вам также нужно сохранить старый stdout и stderr, если вы хотите его снова открыть. Не имеет значения - этот ответ все равно не понравился ;-) – trojanfoe

+0

Проблема может заключаться в том, что некоторые люди не поняли (и не поняли некоторые), какой ответ ожидает OP. Мне кажется, что ваш самый близкий к возможному ответу. –

0
#if TARGET_IPHONE_SIMULATOR 

//Simulator 

#else 

// Device 
#define NSLog 
#endif 

Добавьте это в файл .PCH это отключит NSLog только для устройства в одиночку не для симулятора.

0

Добавить ниже код в файл .PCH

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

И в параметрах сборки, поиск «макросов препроцессора» и удалить «DEBUG = 1» в ней написано.

И вот оно, вы не увидите никаких журналов в консоли.

 Смежные вопросы

  • Нет связанных вопросов^_^