在 imp_implementationWithBlock 中使用 va_list 在 iOS 11 上得到 EXC_BAD_ACCESS
Using va_list in imp_implementationWithBlock get EXC_BAD_ACCESS on iOS 11
我将我的设备升级到 iOS 11-beta6,然后我发现 运行 时间码有问题。
IMP swizzledImplementation = imp_implementationWithBlock(^BOOL(NSObject *obj, ...) {
va_list arguments;
va_start(arguments, obj);
id argument = va_arg(arguments, id);
va_end(arguments);
};
当我尝试使用 va_arg 获取 obj 之后的第一个参数时,应用 运行 变为 EXC_BAD_ACCESS。但是代码在 iOS 模拟器和 ios 10/9/8 上的某些设备上是可以的(它在某些 ios 10.2 设备上也会崩溃)。
va_list有什么变化吗?或 imp_implementationWithBlock?
我想我找到了问题,https://forums.developer.apple.com/thread/38470
On 64-bit ARM varargs routines use different calling conventions from standard routines, thus implementing a non-varargs method with a varargs block is simply not feasible.
我将我的设备升级到 iOS 11-beta6,然后我发现 运行 时间码有问题。
IMP swizzledImplementation = imp_implementationWithBlock(^BOOL(NSObject *obj, ...) {
va_list arguments;
va_start(arguments, obj);
id argument = va_arg(arguments, id);
va_end(arguments);
};
当我尝试使用 va_arg 获取 obj 之后的第一个参数时,应用 运行 变为 EXC_BAD_ACCESS。但是代码在 iOS 模拟器和 ios 10/9/8 上的某些设备上是可以的(它在某些 ios 10.2 设备上也会崩溃)。
va_list有什么变化吗?或 imp_implementationWithBlock?
我想我找到了问题,https://forums.developer.apple.com/thread/38470
On 64-bit ARM varargs routines use different calling conventions from standard routines, thus implementing a non-varargs method with a varargs block is simply not feasible.