2013-04-23 5 views
2

У меня нет четкого представления о объектной переменной переменной аргумента. Я хочу написать функцию, которая примет параметр типа nlsog, но когда-нибудь я буду использовать NSLog внутри этой функции. Как я могу это сделать?NSLog внутри функции переменных аргументов

-(void) printStatus:(NSString*)status, ... 
{ 
    // I want use use NSLog with all these parameter here. 

    // some gui logging also happens here 
} 

Calls будет так,

[self printStatus:@"status"]; 

или

[self printStatus:@"Staus: %@", someObject]; 

Вместо использования NSLog, я хочу использовать printStatus. Когда мне нужно переключить ведение журнала консоли на запись в GUI, я могу сделать это, только изменив функцию printStatus, не меняя все места внутри моего кода.

Или использовать DLOG, как я использую здесь,

#ifdef DEBUG 
# define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) 
#else 
# define DLog(...) /* */ 
#endif 

ответ

6

Вы должны работать с C-х переменной длины типов и NSLogv макросъемки:

-(void)printStatus:(NSString*)status, ... 
{ 
    va_list args; 
    va_start(args, status); 
    NSLogv(status, args); 
    va_end(args); 
} 

Это предполагает, что status аргументом является строка формата с последующим его аргументов.

Если вы хотите создать NSString из строки формата и аргументы (для обновления вашего GUI), вы можете сделать это в дополнение к NSLogv:

NSLogv(status, args); 
NSString *message = [[NSString alloc] initWithFormat:status arguments:args]; 
// ... log to GUI 
+0

спасибо. но я использовал макрос DLog, где я использовал NSLog. Есть ли способ использовать NSLog? #ifdef DEBUG # define DLog (fmt, ...) NSLog ((@ "% s [Line% d]" fmt), __PRETTY_FUNCTION__, __LINE__, ## __ VA_ARGS__) #else # define DLog (...)/* */ #endif – karim

+1

Единственный способ передавать переменные аргументы в функции/методы использует 'va_list'. Вот почему большинство библиотек предлагают альтернативу '* v', которая принимает' va_list'. Поэтому вы должны создать «DLogv», который вызывает «NSLogv», и перенаправлять аргументы на это. –

+0

Спасибо. Я думал о втором случае. Но я не был уверен в первом случае. Поскольку при создании строки во втором случае мне нужно вызвать va_start (args, status), иначе args не будет использоваться для использования с NSString. Не так ли? – karim

-2

Я не могу понять вопрос точно. Как я понял, вы можете использовать отформатированный снабжать струной, тетивой и т.п.

[NSString stringWithFormat:@"this is string %@",@"String"]; 
+0

Вместо использования NSLog, я хочу использовать printStatus. Когда мне нужно переключить ведение журнала консоли на запись в GUI, я могу сделать это, только изменив функцию printStatus, не меняя все места внутри моего кода. – karim

1

Наконец, для заинтересованных людей, вот мой окончательный вариант лесозаготовок ...

-(void) printStatus:(NSString*)status, ... 
{ 
    va_list args; 
    va_start(args, status); 
    va_end(args); 
    NSString * str = [[NSString alloc] initWithFormat:status arguments:args]; 
    DLog(@"%@", str); 
    self.statusTextView.text = [_statusTextView.text stringByAppendingFormat:@"\n%@",str]; 
    [str release]; 
} 

DLog определяется в моем Prefix.pch файле,

#ifdef DEBUG 
# define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) 
#else 
# define DLog(...) /* */ 
#endif 
+0

"// ссылаться на этот метод вместо основного потока. Это не сработает.Вы теряете все аргументы varargs, и функция будет разбиваться по основному потоку, если он ожидает какой-либо из этих аргументов – newacct

+0

спасибо. Я изменил код. Но мне тоже нужно сделать его дружелюбным. – karim

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