函数调用的参数太多,预期为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。