development

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

big-blog 2020. 12. 27. 20:38
반응형

함수 호출에 너무 많은 인수 (예상 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);
}

Following the accepted answer- to find the answer in the given codebase might be cumbersome for few, so here's the quick snap that should solve this problem.

I edited the code in ActionSheetPicker in my project, which was causing me the same problem, like this -

- (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);
}

So look at the change that objc_msgSend portion has, compared to your current code. The idea is to include the type of the parameters you are passing to objc_msgSend


This block of code reproduces the error:

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

Guess where error is? Of course, what_is_this is not declared, but somehow magically it shows another error. In other words looks like if you have block, you can put any parameters when calling it, even non existent variables.

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

반응형