通过委托方法让C++模型通知Objective-C++控制器

Getting C++ model to inform Objective-C++ controller via delegation method

本文关键字:模型 通知 Objective-C++ 控制器 C++ 方法      更新时间:2023-10-16

我用C++编程了一个国际象棋游戏模型。现在,我想要一个Objective-C++控制器来初始化模型对象并成为它的委托。

因此,当模型完成其任务时,它应该通知控制器,并且管理员应该更新视图

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

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

在Objective-C++中。它给了我这个错误:

Assigning to 'Delegate *' from incompatible type 'NSObject *const __strong'

根据我的理解,我需要将委托的类型设置为匿名容器(或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
    }

第二版:

换句话说,我有同样的问题。

委托需要是实现适当委托协议的Objective C类;你不能只停留在C++对象中。我的解决方案是创建一个"中继"类,该类使用指向C++对象的指针初始化,C++对象是消息的真正目标。当调用委托方法时,它会对C++对象执行函数调用。

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