我用 C++ 编写了一个国际象棋游戏模型。现在,我想要一个 Objective-C++ controller 来初始化一个 model 对象并成为它的委托(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 框架)和 C++ 类型 AVFoundationPlayer(也在 osxplayer.mm 中定义)的委托(delegate)之间提供垫片。
关于c++ - 通过委托(delegate)方法获取 C++ 模型以通知 Objective-C++ Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36387232/