Too many arguments to function call, expected 0, have 3

后端 未结 11 1429
情话喂你
情话喂你 2020-12-12 18:55

This compiles/works fine with Xcode 5, but causes a compile error with Xcode 6 Beta 4:

objc_msgSend(anItem.callback_object,
NSSelectorFrom         


        
相关标签:
11条回答
  • 2020-12-12 19:36
    #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);
    }
    
    0 讨论(0)
  • 2020-12-12 19:41

    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

    0 讨论(0)
  • 2020-12-12 19:43

    Maciej Swic is right.This is caused in Pods after updating Cocoapods to 0.36.beta.2. I found a simple workaround by type casting objc_msgSend:

    id (*typed_msgSend)(id, SEL) = (void *)objc_msgSend;
    id<MyProtocol> obJ = typed_msgSend(controller, @selector(myselector));
    
    0 讨论(0)
  • 2020-12-12 19:49

    I found the answer, and it's in Session 417 from 2014 WWDC "What's New in LLVM". If you find this code in a 3rd party library, such as Apsalar, updating to the latest version fixes it (probably because it's not distributed as a lib, ha). For an example of casting of these calls, see THObserversAndBinders library - I'm using it and noticed that the author updated the code, such as here:

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

    0 讨论(0)
  • 2020-12-12 19:49

    You can also disable this with a post install hook:

    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
    
    0 讨论(0)
提交回复
热议问题