Я начал готовить один старый проект для поддержки архитектуры arm64. Но когда я пытаюсь выполнить этот код на 64-битном устройстве, я получаю сообщение об ошибке EXC_BAD_ACCESS в [invocation saveArguments]; lineEXC_BAD_ACCESS авария на arm64 при использовании NSInvocation
- (void)makeObjectsPerformSelector: (SEL)selector withArguments: (void*)arg1, ...
{
va_list argList;
NSArray* currObjects = [NSArray arrayWithArray: self];
for (id object in currObjects)
{
if ([object respondsToSelector: selector])
{
NSMethodSignature* signature = [[object class] instanceMethodSignatureForSelector: selector];
NSInvocation* invocation = [NSInvocation invocationWithMethodSignature: signature];
invocation.selector = selector;
invocation.target = object;
if (arg1 != nil)
{
va_start(argList, arg1);
char* arg = arg1;
for (int i = 2; i < signature.numberOfArguments; i++)
{
const char* type = [signature getArgumentTypeAtIndex: i];
NSUInteger size, align;
NSGetSizeAndAlignment(type, &size, &align);
NSUInteger mod = (NSUInteger) arg % align;
if (mod != 0)
arg += (align - mod);
[invocation setArgument: arg
atIndex: i];
arg = (i == 2) ? (char*) argList : (arg + size);
}
va_end(argList);
}
[invocation retainArguments];
[invocation invoke];
}
}
}
Кажется, что у него есть некоторые проблемы с аргументами.
Не могли бы вы предоставить образец кода, который вызывает этот код и сбой? –
Данный код является категорией класса NSArray, предоставляя возможность для каждого объекта в массиве выполнять селектор с несколькими аргументами. Каждый объект в массиве - это слушатель (делегат), как требует шаблон дизайна «Несколько слушателей». Например, после ответа от сервера мы должны сделать каждый прослушиватель для выполнения селектора. Вызов, расположенный в ответном обратном вызове сервера, выглядит так: '[self.listeners makeObjectsPerformSelector: @selector (serverManager: didLikeVideo: withError :) withArguments: self, operation.video, operation.error, nil];' – abagmut
Итак, нет небезопасных преобразований типов, пожалуйста, проверьте мой обновленный ответ. Не могу понять, почему вы делаете сложные трюки с определением аргументов в памяти. –