获取C++模型通过委托方法通知Objective-C++控制器
问题描述:
我已经用C++编写了一个国际象棋游戏model。现在,我想要一个Objective-C++ 控制器初始化一个模型对象并成为它的委托。获取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
}
第二个编辑:
换句话说,我必须为this同样的问题。
答
委托需要是一个实现适当委托协议的Objective C类;你不能只坚持一个C++对象。我的解决方案是创建一个“中继”类,它使用指向C++对象的指针进行初始化,这是消息的真正目标。当委托方法被调用时,它会在C++对象上执行一个函数调用。
可以在源文件src/mediaunits/audio/osxplayer.mm中的项目pianod2中找到一个示例。 PlayerHelper类在AVPlayer和AVPlayerItem(来自AVFoundation框架)的委托和C++类型AVFoundationPlayer(也在osxplayer.mm中定义)之间提供填充。
感谢您的回答。我检查了你的代码,你正在将一个C++对象分配给一个Objective-C属性。我想做与它完全相反的事情,我想在C++中存储一个Objective-C引用,所以只要我想,我就可以将委托消息发送给它。这就是我想要的。一个Objective-C对象,可以在不知道类型的情况下随时发送消息。 –
我试过别的东西。它的工作,但现在我有内存管理问题,因为我存储的Objective-C对象被释放。它不会被保留很长时间。请参阅编辑。 –
你在unique_ptr中添加一个值,然后用.get()复制它。这将指针留在unique_ptr的手中,在超出范围时被销毁。改为使用.release(),而不是*移动指针。 –