我已经用C++编写了一个象棋游戏模型。现在,我想要一个Objective-C++的 Controller 来初始化模型对象,并使其成为委托(delegate)。

因此,当模型完成其任务时,它应该通知 Controller ,而 Controller 应该更新 View

现在,当我实例化C++ 模型时,如下所示:

Model *model = new Model();
model->delegate = self;

在Objective-C++中。它给了我这个错误:
Assigning to 'Delegate *' from incompatible type 'NSObject *const __strong'

据我了解,我需要使委托(delegate)类型成为匿名容器(或NSObject类型的对象)。

当您连接不同的语言时,最佳解决方案是什么?

编辑:

好的,所以我找到了解决方法,但是现在我遇到了内存管理问题。我正在存储的Objective-C对象在退出范围时被释放。这是代码:
struct SharedObjectiveCObject {
Class sharedObjectiveCObject;
public:
    SharedObjectiveCObject() : sharedObjectiveCObject([GameViewController class]) {}
};



class Controller {

private:
    GameViewController *gameViewController; // THIS GETS RELEASED ON EXITING SCOPE (THIS IS AN OBJECT OF OBJECTIVE-C CLASS)

public:
     Controller() {
        std::unique_ptr<SharedObjectiveCObject> sharedObjectiveCObject(new SharedObjectiveCObject());

        this->gameViewController = (__bridge GameViewController*)(sharedObjectiveCObject.get()); // THIS GETS RELEASED ON EXITING SCOPE
    }

第二编辑:

换句话说,我和this有相同的问题。

最佳答案

委托(delegate)必须是实现适当委托(delegate)协议(protocol)的Objective C类;您不能仅仅停留在C++对象中。我的解决方案是创建一个“中继”类,该类使用指向作为消息真正目标的C++对象的指针进行初始化。调用委托(delegate)方法时,它将对C++对象执行函数调用。

可以在项目pianod2中的源文件src / mediaunits / audio / osxplayer.mm中找到一个示例。 PlayerHelper类提供了AVPlayer和AVPlayerItem(来自AVFoundation框架)的委托(delegate)以及C++类型AVFoundationPlayer(同样在osxplayer.mm中定义)之间的填充。

关于c++ - 通过委派方法获取C++模型以通知Objective-C++ Controller ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36387232/

10-14 23:21
查看更多