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

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

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

这是一个第三方组件 ,虽然我有源代码,但它不是真的我的代码,我很犹豫要改变它(尽pipe我个人认为'wtf为什么他们使用objc_msgSend ??')。

图像可能有用的细节(错误浏览器中的错误): 在这里输入图像说明

如果您认为必须这样做是烦人的和毫无意义的,您可以通过将“启用严格检查objc_msgSend调用”设置为no来禁用生成设置中的检查

我find了答案,并且在2014年的WWDC会议417“LLVM中的新function”中。 如果您在第三方库(例如Apsalar)中find此代码,则更新到最新版本可能会修复该代码(可能是因为它没有作为库分发)。 有关调用这些调用的示例,请参阅THObserversAndBinders库 – 我正在使用它,并注意到作者更新了代码,例如:

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

这也可能是由使用Cocoapods 0.36.beta.2运行pod install引起的。 我已经向CocoaPods报告了这个问题。 通过使用CocoaPods 0.35 “解决方法”

只是为了节省观看WWDCvideo,答案是你需要强壮的typesobjc_msgSend让编译器来构build它:

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

使用强types为methodInstance使LLVM编译器高兴:

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

不要忘记设置send_type的返回和参数types根据您的具体需求。

Maciej Swic是正确的。这是在更新Cocoapods到0.36.beta.2后在豆荚中引起的。 我通过types强制转换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,并inputNOdebugging和发布。

设置Enable strict checking of objc_msgSend Calls NO ,解决了我的问题。 下面是截图

在这里输入图像说明

您也可以使用后安装钩子来禁用此function:

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

遵循接受的答案 – 在给定的代码库中find答案可能会很麻烦,因此这里应该快速解决这个问题。

我在我的项目中编辑了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的更改。 这个想法是包含你传递给objc_msgSend的参数的types

这段代码重现错误:

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

猜猜错误在哪里? 当然, what_is_this没有被宣布,但不知何故,它显示了另一个错误。 换句话说,如果你有块,你可以在调用它的时候放入任何参数,甚至是不存在的variables。