gpt4 book ai didi

ios - 函数调用的参数太多,预期为 0,有 2

转载 作者:行者123 更新时间:2023-12-01 15:26:12 26 4
gpt4 key购买 nike

去年我们从 Pixate 迁移到 StylingKit
https://github.com/StylingKit/StylingKit Pixate 的一个分支,据我所知,它仍在开发中。
然而,随着 XCode 11 的发布,我们现在遇到了问题,在 pior 版本中它工作得很好,但现在它不会编译。

    void* callSuper0(id self, Class superClass, SEL _cmd)
{
struct objc_super super;
super.receiver = (__bridge void *)self;
super.class = superClass != NULL ? superClass : class_getSuperclass(object_getClass(self));
return objc_msgSendSuper(&super, preprocessSEL(_cmd));
}

return objc_msgSendSuper(&super, preprocessSEL(_cmd));
抛出错误“函数调用的参数过多,预​​期为 0,有 2”
我尝试更改一些建筑设置,如 Too many arguments to function call, expected 0, have 3 所示。特别是“启用对 objc_msgSend Calls to NO 的严格检查”,但它没有帮助。
任何帮助,将不胜感激。

最佳答案

注意:下面的代码没有执行,因为它只是一个片段,但是它已经被 Xcode 10 & 11 编译。可能有错误或其他问题。

在 Xcode 中右键单击 objc_superobjc_msgSendSuper并选择“跳转到定义”,这将打开包含定义的系统文件。这将显示两件事:

  • objc_super 的字段名称和类型自您编写代码以来已更改,其中一些记录在注释中。
  • objc_msgSendSuper 的原型(prototype)也改为了 void objc_msgSendSuper(void) ,以前的原型(prototype)也有id _Nullable
    objc_msgSendSuper(struct objc_super * _Nonnull super, SEL _Nonnull op, ...)
    .使用之前的原型(prototype),可以在代码中调用此函数而无需强制转换,而对于这个新原型(prototype),则需要强制转换。

  • 对代码进行指示的更改给出:
    // A typedef for objc_msgSendSuper which takes only the required (first two) arguments
    typedef void *(*NoAdditionalArgMsgSendSuper)(struct objc_super *super_class, SEL selector);

    void* callSuper0(id self, Class superClass, SEL _cmd)
    {
    struct objc_super super;
    // .receiver is now defined as "__unsafe_unretained _Nonnull id" so no bridge cast required
    super.receiver = self;
    // .super_class is new name for .class
    super.super_class = superClass != NULL ? superClass : class_getSuperclass(object_getClass(self));
    // cast objc_msgSendSuper to the correct type and then call
    return ((NoAdditionalArgMsgSendSuper)objc_msgSendSuper)(&super, preprocessSEL(_cmd));
    }

    高温高压

    附录

    继您的评论和代码帖子作为另一个答案之后。

    在您的代码中,您编写:
    void* (*objc_msgSendSuperTyped)(id self, SEL _cmd) = (void*)objc_msgSendSuper;
    return objc_msgSendSuperTyped((id) &super, preprocessSEL(_cmd));

    制作函数指针的类型化副本,而不是像我们之前的代码那样强制转换使用,这很好。但是,当您尝试将非保留类型( &super - 结构指针)转换为保留类型( id)时,您的代码应该会从 Xcode 产生错误——这需要桥接转换。

    这里的解决方案是给 objc_msgSendSuperTyped正确的类型,它的第一个参数应该是一个结构指针:
    void* (*objc_msgSendSuperTyped)(struct objc_super *self, SEL _cmd) = (void*)objc_msgSendSuper;
    return objc_msgSendSuperTyped(&super, preprocessSEL(_cmd));

    从您的评论中:

    I had to change super.super_class to super.class for it to work, it now throws other errors unrelated.



    这表明你有一些不寻常的设置,在 objc_super 的声明中。我们发现:
    #if !defined(__cplusplus)  &&  !__OBJC2__
    /* For compatibility with old objc-runtime.h header */
    __unsafe_unretained _Nonnull Class class;
    #else
    __unsafe_unretained _Nonnull Class super_class;
    #endif
    __OBJC2__在 Xcode 11(以及许多早期版本)中默认为 .m 定义和 .mm文件, __cplusplus.mm 定义仅文件。所以条件 !defined(__cplusplus) && !__OBJC2__false因此该字段被命名为 super_class ...

    您可能希望确定 __OBJC2__ 的原因显然没有为您要转换的源定义...

    关于ios - 函数调用的参数太多,预期为 0,有 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58116456/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com