这与Xcode 5一起编译/工作正常,但是在Xcode 6 Beta 4中导致编译错误:
objc_msgSend(anItem.callback_object, NSSelectorFromString(anItem.selector), dict);
这是一个第三方组件,所以虽然我有源代码,但它并不是我的代码,我很想改变它(尽管我个人认为'wtf为什么他们使用objc_msgSend
??').
带有可能有用细节的图像(错误浏览器中的错误):
只是为了节省观看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的返回和参数类型.
如果您认为必须这样做是烦人且毫无意义的,您可以通过将"启用严格检查objc_msgSend呼叫"设置为"否"来禁用构建设置中的检查
我在QuickDialog中遇到了这个错误.继james_alvarez的答案,但对于AppCode,转到Project Settings
,然后单击QuickDialog
项目/共享设置下,向下滚动到ENABLE_STRICT_OBJC_MSGSEND并为调试和发布输入NO.
这也可能是由于pod install
使用Cocoapods 运行造成的0.36.beta.2
.我向CocoaPods报告了这个问题.使用CocoaPods"解决方法"0.35
设置Enable strict checking of objc_msgSend Calls
为NO
,解决了我的问题.以下是截图
我找到了答案,这是2014年WWDC会议第417期"LLVM中的新功能".如果您在第三方库(例如Apsalar)中找到此代码,则更新到最新版本会修复它(可能因为它不是作为lib分发的,哈哈).有关转换这些调用的示例,请参阅THObserversAndBinders库 - 我正在使用它并注意到作者更新了代码,例如:
https://github.com/th-in-gs/THObserversAndBinders/blob/master/THObserversAndBinders/THObserver.m
您也可以使用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
Maciej Swic是对的.这是在将Cocoapods更新为0.36beta后在Pods中造成的.我通过类型转换objc_msgSend找到了一个简单的解决方法:
id (*typed_msgSend)(id, SEL) = (void *)objc_msgSend; id<MyProtocol> obJ = typed_msgSend(controller, @selector(myselector));