代码之家  ›  专栏  ›  技术社区  ›  JOM agenthunt

普通C回调函数指针作为iPhone委托协议的一部分?

  •  0
  • JOM agenthunt  · 技术社区  · 15 年前

    尝试将普通C/C++代码作为外部静态库集成到iPhone项目中。到目前为止还不错,但现在我被困在一个点上,我需要这样做 注册库回调 . 当发生某些事情时,库应该通知我的iPhone应用程序。似乎是一个好地方来定义 代表

    …但库希望回调使用C函数指针。我如何定义这些 ,如何将它们用作委托模式的一部分?

    registerCallBack(&aCBack, &bCBack, &cCBack, &dCBack, &eCBack);
    
    typedef void (aCBack)(uint32_t magic);
    typedef void (bCBack)(const NewData* newData);
    typedef void (cCBack)(uint32_t value, const std::vector<DataStuff*>* stuff);
    typedef void (dCBack)(uint32_t value, const SomeData* data, const std::string text, uint32_t type);
    typedef void (eCBack)(uint32_t value, const MoreData* more);
    

    …哦,顺便说一句,问题之一是每个Objective-C类方法都有两个隐藏参数。根本不知道该怎么处理。除了更改外部库的接口之外。

    2 回复  |  直到 15 年前
        1
  •  4
  •   Community TheSoundDefense    7 年前

    您需要为回调使用C++/C接口,然后在内部将调用委托给Objective-C代码。当回调注册允许您传入足够大的用户数据时,您可以方便地传递标识上下文的内容,如 this answer .
    没有传递任何上下文的回调无论如何都必须调用Objective-C部分的类方法。

        2
  •  2
  •   walkytalky    15 年前

    // need to have a reference to the object, of course
    static DelegateClass* delegate = NULL;
    
    // call at runtime with your actual delegate
    void setCallbackDelegate ( DelegateClass* del ) { delegate = del; }
    
    void callbackA ( uint32_t magic )
    {
        [delegate handleCallbackA:magic];
    }
    
    // and so on...
    

    [更新:正如gf所指出的,您可以使用类方法,避免使用 setCallbackDelegate .]