Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 委托被销毁_C++_Objective C_Swift_Memory - Fatal编程技术网

C++ 委托被销毁

C++ 委托被销毁,c++,objective-c,swift,memory,C++,Objective C,Swift,Memory,我正在构建一个跨平台应用程序,其中一个平台是Macos 现在我的代码核心是用C++编写的,Obj-c++。 我创建的窗口如下所示: NSWindow* window = [[NSWindow alloc] initWithContentRect:NSMakeRect(x, y, width, height) styleMask:macosWindowStyle backing:NSBackingStoreBuffered defer:false]; 但我想听听窗户的声音。我本可以将其子类化,但

我正在构建一个跨平台应用程序,其中一个平台是Macos

现在我的代码核心是用C++编写的,Obj-c++。 我创建的窗口如下所示:

NSWindow* window = [[NSWindow alloc] initWithContentRect:NSMakeRect(x, y, width, height) styleMask:macosWindowStyle backing:NSBackingStoreBuffered defer:false];
但我想听听窗户的声音。我本可以将其子类化,但我选择了不

NSWindow
获取事件的另一种方法是设置一个委托

现在由于我的代码是在Obj-C++中,所以我不能让一个C++类从Obj-C协议继承。 因此,我创建了一个Obj-C头,它实现了
NSWindowDelegate

这是:

@interface SomeClass : NSObject<NSWindowDelegate>

@end
在我的Obj-C++文件中,我做到了:

NSWindow* window = [[NSWindow alloc] initWithContentRect:NSMakeRect(x, y, width, height) styleMask:macosWindowStyle backing:NSBackingStoreBuffered defer:false];
SomeClass* someClass = [[SomeClass alloc] init];
[window setDelegate:someClass];
然而,当我按下X按钮时,什么也没发生

然后我继续用Swift测试同样的东西,同样的结果

然后我意识到代理被销毁了,因为它是一个弱引用

我的问题是,我该怎么解决这个问题呢?

好的,我想好了。
出于某种原因,我认为我的Obj-C++代码中不能有Obj-C类指针。我认为这是一个限制。

在哪里创建窗口(在函数、方法等中),在哪里存储窗口?您可以将代理存储在同一个位置吗?(例如,作为类的一部分作为变量)是的,我刚刚发现了这一点。出于某种原因,我认为在obj-c++中也不能有obj-c引用。
NSWindow* window = [[NSWindow alloc] initWithContentRect:NSMakeRect(x, y, width, height) styleMask:macosWindowStyle backing:NSBackingStoreBuffered defer:false];
SomeClass* someClass = [[SomeClass alloc] init];
[window setDelegate:someClass];