2014-09-18 3 views
2

Следующий код отлично работает на iOS7. И он падает, когда я запускаю Xcode6/iOS.iOS8 EXC_BAD_ACCESS при выполнении [[NSString alloc] initWithFormat: аргументы формата: argList]

+ (void)log:(NSString *)format arguments:(va_list)argList 
{ 
    NSLogv(format, argList); 

    if ([self sharedConsole].enabled) 
    { 
     NSString *message = [[NSString alloc] initWithFormat:format arguments:argList]; //Crash here with info of EXC_BAD_ACCESS 
     if ([NSThread currentThread] == [NSThread mainThread]) 
     { 
      [[self sharedConsole] logOnMainThread:message]; 
     } 
     else 
     { 
      [[self sharedConsole] performSelectorOnMainThread:@selector(logOnMainThread:) 
                withObject:message waitUntilDone:NO]; 
     } 
    } 
} 

ответ

4

Такая же проблема для меня!

изменение реализации NSLogv на iOS8

Моим решения: близко va_list и переинициализацию его между каждым использованием.

+ (void)log:(NSString *)format arguments:(va_list)argList 
{ 
    va_start(argList,format) ; 
    NSLogv(format, argList); 
    va_end(afgList) ; 

    va_start(argList,format) ; 
    if ([self sharedConsole].enabled) 
    { 
     NSString *message = [[NSString alloc] initWithFormat:format arguments:argList]; //Crash here with info of EXC_BAD_ACCESS 
     if ([NSThread currentThread] == [NSThread mainThread]) 
     { 
      [[self sharedConsole] logOnMainThread:message]; 
     } 
     else 
     { 
      [[self sharedConsole] performSelectorOnMainThread:@selector(logOnMainThread:) 
                withObject:message waitUntilDone:NO]; 
     } 
    } 
    va_end(afgList) ; 
} 
1

Как указал пользователь2424230, список аргументов должен быть повторно инициализирован. Если ваш метод был переменным, вы могли бы использовать va_start и va_end. Однако кажется, что вы инициализируете и передаете va_list извне. В этом случае вы можете скопировать список, как это:

+ (void)log:(NSString *)format arguments:(va_list)argList 
{ 
    va_list internalArgs; 

    va_copy(internalArgs, argList); 
    NSLogv(format, internalArgs); 
    va_end(internalArgs); 

    va_copy(internalArgs, argList); 
    if ([self sharedConsole].enabled) 
    { 
     NSString *message = [[NSString alloc] initWithFormat:format arguments:internalArgs]; 
     if ([NSThread currentThread] == [NSThread mainThread]) 
     { 
      [[self sharedConsole] logOnMainThread:message]; 
     } 
     else 
     { 
      [[self sharedConsole] performSelectorOnMainThread:@selector(logOnMainThread:) 
                withObject:message waitUntilDone:NO]; 
     } 
    } 
    va_end(internalArgs); 
} 
0

Наиболее распространенный случай для initWithFormat: аргументы: сбой, когда строка формата содержит больше параметров, чем аргументы указанных.

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