UFO ET IT

함수 호출에 너무 많은 인수 (예상 0)가 3 개 있습니다.

ufoet 2020. 12. 26. 15:46
반응형

함수 호출에 너무 많은 인수 (예상 0)가 3 개 있습니다.


이것은 Xcode 5 에서 잘 컴파일 / 작동 하지만 Xcode 6 Beta 4 에서는 컴파일 오류가 발생합니다 .

objc_msgSend(anItem.callback_object,
NSSelectorFromString(anItem.selector), dict);

이것은 타사 구성 요소 이므로 소스 코드가 있지만 실제로는 내 코드가 아니며 많이 변경하는 것이 주저합니다 ( 'wtf 왜 사용하고 있습니까 objc_msgSend??'에 대한 개인적인 의견에도 불구하고 ).

유용한 세부 정보가 포함 된 이미지 (오류 브라우저 오류) : 여기에 이미지 설명 입력


이 작업이 성 가시고 무의미하다고 생각되면 'objc_msgSend Calls의 엄격한 검사 활성화'를 no로 설정하여 빌드 설정에서 검사를 비활성화 할 수 있습니다.


답을 찾았고 2014 년 WWDC "LLVM의 새로운 기능"세션 417에 있습니다. Apsalar와 같은 타사 라이브러리에서이 코드를 찾은 경우 최신 버전으로 업데이트하면 문제가 해결됩니다 (아마도 lib, ha로 배포되지 않기 때문일 수 있음). 이러한 호출의 캐스팅에 대한 예제는 THObserversAndBinders 라이브러리를 참조하세요. 사용 중이며 작성자가 다음과 같이 코드를 업데이트 한 것을 확인했습니다.

https://github.com/th-in-gs/THObserversAndBinders/blob/master/THObserversAndBinders/THObserver.m


WWDC 비디오를 보는 것을 아끼기 위해 컴파일러가 빌드하려면 강력한 유형의 objc_msgSend가 필요합니다.

typedef void (*send_type)(void*, SEL, void*);
send_type func = (send_type)objc_msgSend;
func(anItem.callback_object, NSSelectorFromString(anItem.selector), dict);

다음은 다음과 같이 인스턴스 메서드를 직접 호출 할 때의 또 다른 샘플입니다.

IMP methodInstance = [SomeClass instanceMethodForSelector:someSelector];
methodInstance(self, someSelector, someArgument);

methodInstance에 강력한 유형을 사용하여 LLVM 컴파일러를 행복하게 만듭니다.

typedef void (*send_type)(void*, SEL, void*);
send_type methodInstance = (send_type)[SomeClass instanceMethodForSelector:someSelector];
methodInstance(self, someSelector, someArgument);

특정 요구에 따라 send_type의 반환 및 인수 유형을 설정하는 것을 잊지 마십시오.


pod installCocoapods를 사용하여 실행할 수도 있습니다 0.36.beta.2. CocoaPods에 문제를보고했습니다. CocoaPods를 사용하여 "해결 방법"0.35


로 설정 Enable strict checking of objc_msgSend Calls하여 NO내 문제를 해결했습니다. 아래는 스크린 샷입니다

여기에 이미지 설명 입력


Maciej Swic이 맞습니다. 이것은 Cocoapods를 0.36.beta.2로 업데이트 한 후 포드에서 발생합니다. objc_msgSend 유형을 캐스팅하여 간단한 해결 방법을 찾았습니다.

id (*typed_msgSend)(id, SEL) = (void *)objc_msgSend;
id<MyProtocol> obJ = typed_msgSend(controller, @selector(myselector));

QuickDialog에서이 오류가 발생했습니다. james_alvarez의 대답 만에에 따라 AppCode 로 이동 Project Settings한 후 클릭, QuickDialog프로젝트 / 공유 설정에서 ENABLE_STRICT_OBJC_MSGSEND 아래로 스크롤 및 디버그 및 릴리스에 대한 NO를 입력합니다.


설치 후 후크를 사용하여이를 비활성화 할 수도 있습니다.

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['ENABLE_STRICT_OBJC_MSGSEND'] = 'NO'
        end
    end
end

#include <objc/message.h>

void foo(void *object) {
  typedef void (*send_type)(void *, SEL, int);
  send_type func = (send_type)objc_msgSend;
  func(object, sel_getUid("foo:"), 5);
}

받아 들여진 대답을 따르는-주어진 코드베이스에서 대답을 찾는 것은 소수에게는 번거로울 수 있으므로 여기에이 문제를 해결해야하는 빠른 스냅이 있습니다.

ActionSheetPicker내 프로젝트에서 코드를 편집하여 이와 같은 문제를 일으켰습니다.

- (void)notifyTarget:(id)target didSucceedWithAction:(SEL)action origin:(id)origin {
    if ([target respondsToSelector:action]) {
        ((id (*)(id, SEL, NSDate *, id))objc_msgSend)(target, action, self.selectedDate, origin);
        return;
    } else if (nil != self.onActionSheetDone) {
        self.onActionSheetDone(self, self.selectedDate, origin);
        return;
    }

    NSAssert(NO, @"Invalid target/action ( %s / %s ) combination used for ActionSheetPicker", object_getClassName(target), (char *)action);
}

따라서 objc_msgSend현재 코드와 비교하여 해당 부분 의 변경 사항을 살펴보십시오 . 아이디어는 전달하는 매개 변수의 유형을 포함하는 것입니다.objc_msgSend


이 코드 블록은 오류를 재현합니다.

- (void)reportSuccess:(void(^)(void))success
{
    success(what_is_this);
}

오류가 어디에 있는지 맞춰보세요? 물론, what_is_this 는 선언되지 않았지만 어떻게 든 마술 적으로 또 다른 오류를 보여줍니다. 즉, 블록이 있으면 호출 할 때 존재하지 않는 변수를 포함하여 모든 매개 변수를 넣을 수있는 것처럼 보입니다.

참조 URL : https://stackoverflow.com/questions/24922913/too-many-arguments-to-function-call-expected-0-have-3

반응형