当使用64位iOS模拟器时,下面的init函数会因EXC_BAD_ACCESS(code = 1)错误而崩溃。谁会知道为什么?以及如何正确修复它。
有关信息:'格式'不是零,它可以在32位模拟器和任何32/64位iPhone / iPad设备上正常工作。
void Log (NSString * format, ...)
{
va_list argList;
va_start(argList, format);
NSLogv(format, argList);
NSString* string = [[NSString alloc] initWithFormat: format arguments: argList];
va_end(argList);
...
}
在AppDelegate中首先调用了
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
Log(@"app options %@", launchOptions);
...
}
答案 0 :(得分:11)
不知何故A-Live评论给了我一个想法,我发现了如何避免崩溃。
我在同一个va_start / va_end块中使用argList两次
[[NSString alloc] initWithFormat: format arguments: argList];
和
NSLogv(format, argList);
似乎iOS 64位模拟器并不喜欢它。不知道为什么它只能在任何其他平板电脑(以及真实设备)中找到它。所以我通过制作两个不同的bock来修复它
va_list argList;
va_start(argList, format);
NSString* string = [[NSString alloc] initWithFormat: format arguments: argList];
va_end(argList);
va_start(argList, format);
NSLogv(format, argList);
va_end(argList);
希望它会帮助某人。 如果有人知道原因,我仍然很想知道它。
答案 1 :(得分:1)
昨晚我也遇到了这个问题。我为此提交了雷达。
我现在的工作是制作一个va_copy:
NSString *description = nil;
va_list vaListCopy;
va_copy(vaListCopy, arguments);
if (format) {
description = [[NSString alloc] initWithFormat:format arguments:vaListCopy];
}
然后我打电话给下一个方法
[[BKAssertRecordHandler currentHandler] recordFailureWithCondition:condition function:function file:file line:line description:format arguments:arguments backtrace:backtrace];
换句话说,我在本地使用副本。 我做了一些实验。我制作了一份副本,如果是va_list,然后将其与原版进行比较,原版之后就这样使用了。
description = [[NSString alloc] initWithFormat:format arguments:arguments];
字节比较期间的输出:索引8处的不匹配(orig = 0xd8 copy = 0xe0)。在通话之前,我也进行了字节比较,它们是相同的。
因此无论出于何种原因,在64位模拟器上,initWithFormat:arguments和NSLogv都会破坏va_list。