【问题标题】:Delegate gets destroyed代表被摧毁
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 2016-02-21
    • 1970-01-01
    相关资源
    最近更新 更多