执行[[NSString alloc] initWithFormat:格式参数:argList]时的iOS8 EXC_BAD_ACCESS

时间:2014-09-18 11:16:45

标签: ios8 xcode6

以下代码适用于iOS7。当我在Xcode6 / iOS上运行时崩溃了。

+ (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];
        }
    }
}

3 个答案:

答案 0 :(得分:4)

对我来说同样的问题!

NSLog与iOS 8上的实施更改

我的解决方案:关闭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 :(得分:1)

当user2424230指出必须重新初始化参数列表时。如果你的方法是可变的,你可以使用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);
}

答案 2 :(得分:0)

initWithFormat最常见的情况:参数:崩溃是指格式字符串包含的参数多于指定参数的参数。