首页 > 解决方案 > 代表被摧毁

问题描述

我正在构建一个跨平台应用程序,其中一个平台是 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 中测试同样的东西,同样的结果。

然后我意识到委托被破坏了,因为它是一个弱引用。

我的问题是,我该如何解决这个问题?

标签: c++objective-cswiftmemory

解决方案


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


推荐阅读