以下代码适用于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];
}
}
}
答案 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最常见的情况:参数:崩溃是指格式字符串包含的参数多于指定参数的参数。