让 C++ 模型通过委托方法通知 Objective-C++ 控制器
Getting C++ model to inform Objective-C++ controller via delegation method
我用 C++ 编写了一个国际象棋游戏 model。现在,我想要一个 Objective-C++ controller 来初始化一个 model 对象并成为它的委托。
因此,当 model 完成它的任务时,它应该通知 controller 和 controller 应该更新 view.
现在,当我像这样实例化 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
}
第二次编辑:
换句话说,我和this有同样的问题。
委托人需要是 Objective C class 实施适当的委托协议;你不能只坚持 C++ 对象。我的解决方案是创建一个 "relay" class 并使用指向作为消息真正目标的 C++ 对象的指针进行初始化。调用委托方法时,它会对 C++ 对象执行函数调用。
可以在项目 pianod2 的源文件 src/mediaunits/audio/osxplayer.mm 中找到示例。 class PlayerHelper 提供 AVPlayer 和 AVPlayerItem(来自 AVFoundation 框架)和 C++ 类型 AVFoundationPlayer 之间的垫片,也在 osxplayer.mm.
中定义
我用 C++ 编写了一个国际象棋游戏 model。现在,我想要一个 Objective-C++ controller 来初始化一个 model 对象并成为它的委托。
因此,当 model 完成它的任务时,它应该通知 controller 和 controller 应该更新 view.
现在,当我像这样实例化 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
}
第二次编辑:
换句话说,我和this有同样的问题。
委托人需要是 Objective C class 实施适当的委托协议;你不能只坚持 C++ 对象。我的解决方案是创建一个 "relay" class 并使用指向作为消息真正目标的 C++ 对象的指针进行初始化。调用委托方法时,它会对 C++ 对象执行函数调用。
可以在项目 pianod2 的源文件 src/mediaunits/audio/osxplayer.mm 中找到示例。 class PlayerHelper 提供 AVPlayer 和 AVPlayerItem(来自 AVFoundation 框架)和 C++ 类型 AVFoundationPlayer 之间的垫片,也在 osxplayer.mm.
中定义