C++ 委托被销毁
我正在构建一个跨平台应用程序,其中一个平台是Macos 现在我的代码核心是用C++编写的,Obj-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]; 但我想听听窗户的声音。我本可以将其子类化,但
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];