【发布时间】:2021-02-09 05:03:18
【问题描述】:
我正在构建一个跨平台应用程序,其中一个平台是 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
我这样覆盖了windowShouldClose:
- (BOOL)windowShouldClose:(NSWindow *)sender {
NSLog(@"Hello!");
return true;
}
在我的 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 引用。
标签: c++ objective-c swift memory