函数调用的参数太多,预期为0,有3个

Ale*_*ian 57 xcode

这与Xcode 5一起编译/工作正常,但是在Xcode 6 Beta 4中导致编译错误:

objc_msgSend(anItem.callback_object,
NSSelectorFromString(anItem.selector), dict);
Run Code Online (Sandbox Code Playgroud)

这是一个第三方组件,所以虽然我有源代码,但它并不是我的代码,我很想改变它(尽管我个人认为'wtf为什么他们使用objc_msgSend??').

带有可能有用细节的图像(错误浏览器中的错误): 在此输入图像描述

jam*_*rez 115

如果您认为必须这样做是烦人且毫无意义的,您可以通过将"启用严格检查objc_msgSend呼叫"设置为"否"来禁用构建设置中的检查

  • 我做了早晨。非常感谢你! (2认同)
  • Pfiouuuu ...很高兴我找到了你的答案! (2认同)
  • 如果错误源自可可豆荚,我不认为这是一个选项. (2认同)
  • 这是 cocoapod 的一个选项,但您必须滚动到工作区中的“Pods”项目(在我的情况下,滚动到实际的目标 pod) (2认同)

Vla*_*rov 23

只是为了节省观看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);
Run Code Online (Sandbox Code Playgroud)

这是直接调用实例方法的另一个示例,如下所示:

IMP methodInstance = [SomeClass instanceMethodForSelector:someSelector];
methodInstance(self, someSelector, someArgument);
Run Code Online (Sandbox Code Playgroud)

对methodInstance使用强类型以使LLVM编译器满意:

typedef void (*send_type)(void*, SEL, void*);
send_type methodInstance = (send_type)[SomeClass instanceMethodForSelector:someSelector];
methodInstance(self, someSelector, someArgument);
Run Code Online (Sandbox Code Playgroud)

不要忘记根据您的特定需求设置send_type的返回和参数类型.


Ale*_*ian 22

我找到了答案,这是2014年WWDC会议第417期"LLVM中的新功能".如果您在第三方库(例如Apsalar)中找到此代码,则更新到最新版本会修复它(可能因为它不是作为lib分发的,哈哈).有关转换这些调用的示例,请参阅THObserversAndBinders库 - 我正在使用它并注意到作者更新了代码,例如:

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


Mac*_*wic 20

这也可能是由于pod install使用Cocoapods 运行造成的0.36.beta.2.我向CocoaPods报告了这个问题.使用CocoaPods"解决方法"0.35

  • 什么.的.他妈的. (3认同)

aru*_*007 14

设置Enable strict checking of objc_msgSend CallsNO,解决了我的问题.以下是截图

在此输入图像描述


Sah*_*oor 7

Maciej Swic是对的.这是在将Cocoapods更新为0.36beta后在Pods中造成的.我通过类型转换objc_msgSend找到了一个简单的解决方法:

id (*typed_msgSend)(id, SEL) = (void *)objc_msgSend;
id<MyProtocol> obJ = typed_msgSend(controller, @selector(myselector));
Run Code Online (Sandbox Code Playgroud)


Al *_*ath 6

我在QuickDialog中遇到了这个错误.继james_alvarez的答案,但对于AppCode,转到Project Settings,然后单击QuickDialog项目/共享设置下,向下滚动到ENABLE_STRICT_OBJC_MSGSEND并为调试和发布输入NO.


jos*_*new 5

您也可以使用post install钩子禁用它:

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
Run Code Online (Sandbox Code Playgroud)