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

 mobiledu2502926703 发布于 2023-01-01 14:19

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

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

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

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

8 个回答
  • 只是为了节省观看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的返回和参数类型.

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

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

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

    2023-01-01 14:22 回答
  • 设置Enable strict checking of objc_msgSend CallsNO,解决了我的问题.以下是截图

    在此输入图像描述

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

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

    2023-01-01 14:22 回答
  • 您也可以使用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
    

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

    id (*typed_msgSend)(id, SEL) = (void *)objc_msgSend;
    id<MyProtocol> obJ = typed_msgSend(controller, @selector(myselector));
    

    2023-01-01 14:22 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有