arm64 아키텍처를 지원하는 하나의 이전 프로젝트를 준비했습니다. 하지만 64 비트 장치에서이 코드를 실행하려고하면 [호출 retainArguments]에서 EXC_BAD_ACCESS 충돌이 발생합니다. lineNSInvocation을 사용할 때 arm64에서 EXC_BAD_ACCESS 충돌이 발생합니다.
- (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
그래서, 안전하지 않은 유형 변환이 없으면 업데이트 된 답변을 확인하십시오. 메모리에서 인수 찾기와 함께 복잡한 트릭을하는 이유를 이해할 수 없습니다. –