2016-04-03 46 views
1

我已经用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同样的问题。

回答

1

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

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

+0

感谢您的回答。我检查了你的代码,你正在将一个C++对象分配给一个Objective-C属性。我想做与它完全相反的事情,我想在C++中存储一个Objective-C引用,所以只要我想,我就可以将委托消息发送给它。这就是我想要的。一个Objective-C对象,可以在不知道类型的情况下随时发送消息。 –

+0

我试过别的东西。它的工作,但现在我有内存管理问题,因为我存储的Objective-C对象被释放。它不会被保留很长时间。请参阅编辑。 –

+1

你在unique_ptr中添加一个值,然后用.get()复制它。这将指针留在unique_ptr的手中,在超出范围时被销毁。改为使用.release(),而不是*移动指针。 –