非模态 Windows 内存管理

2023-12-30

我是 Mac 开发新手。我来自 iPhone 开发人员。 我的问题涉及非模式窗口管理。它与iPhone及其内存管理模型有很大不同。

举例来说,我有一个首选项窗口,我可以使用类似的东西来显示该窗口:

-(IBAction)showPreferenceController:(id)sender {
  if (!preferenceController) {
  preferenceController = [[PreferenceController alloc]init];
  }
  [preferenceController showWindow:preferenceController]; 
}

但使用此代码,该窗口将在应用程序生命周期中保留在内存中,因为该窗口永远不会被释放。

为了避免这种情况,我还可以使用此处描述的方法:
stackoverflow.com/questions/1391260/who-owns-an-nswindowcontroller-in-standard-practice
创建于PreferenceController a + (id) sharedInstance并使用释放窗口(void)windowWillClose:(NSNotification *)notification

我看到许多可可代码示例,其中非模式窗口从未被释放。 例如这里:http://www.mattballdesign.com/blog/2008/10/01/building-a-preferences-window/ http://www.mattballdesign.com/blog/2008/10/01/building-a-preferences-window/:首选项面板和所有子视图均在中创建awakeFromNib因此在应用程序的整个生命周期中都将存在于内存中。

如果以 Xcode 应用程序为例,有很多非模式窗口:
- 全局查找窗口(CMD+MAJ+F)
- 应用程序信息面板
- 帮助窗口
- ...

我认为这些窗口在关闭时会被释放,以保持尽可能低的内存。 我想要一些建议来了解在可可应用程序中管理非模式窗口的最佳方法。 保留在记忆中吗?尽快释放? 我知道与 iPhone 相比,Mac 拥有大量内存,但我也认为保留我们不使用的内存对象并不好。

Thanks.

与 Rob 帖子一起编辑 :

我将 -autorelease 发送到窗口并将指针设置为 nil,以便稍后重新创建窗口。这与您引用的技术类似,尽管是否为控制器使用 +sharedController 并不相关;无论您是否有共享控制器,您都可以执行此操作。

如果没有单例(+sharedController),我不知道如何做到这一点。
我用这个例子解释我的意思:
在应用程序控制器中:

@interface AppController : NSObject <NSApplicationDelegate> {

执行 :

-(IBAction)showPreferenceController:(id)sender {  
  if (!preferenceController) {
    preferenceController = [[PreferenceController alloc]init];
  }
  [preferenceController showWindow:preferenceController];
}  

在首选项控制器中:

@interface PreferenceController : NSWindowController <NSWindowDelegate>

执行 :

- (void)windowWillClose:(NSNotification *)notification {
  [self autorelease];self=nil;
}

当我关闭窗口并在窗口后重新打开时,它会崩溃:preferenceController被释放但不等于nil。所以我需要在窗口关闭时将preferenceController设置为nil。 对于单例来说这样做没有问题。
如果没有单例,我应该将 appController 设置为首选项窗口的委托,以便能够在窗口关闭时将首选项控制器设置为 nil。但我不喜欢这样。

编辑普雷斯顿评论
我没有这么说,但我只想要我的非模态窗口的一个实例,即使我们调用-(IBAction)showPreferenceController:(id)sender几次。
这就是为什么我测试appController中的preferenceController是否等于nil。
因此,如果我们关闭窗口,我需要在 appController 中将preferenceController 设置为 nil。
所以解决方案是:
在应用程序控制器中,监听 NSWindowWillCloseNotification:

- (void)windowWillClose:(NSNotification *)notification {
    if ([notification object] == [preferenceController window]) {
        [preferenceController autorelease];
        preferenceController = nil;
    }
}

这是对的吗?这是唯一的解决方案吗?因为管理我的非模态窗口似乎有点复杂......


你在这里的思考方式都是正确的。仅仅因为内存很多就泄漏内存是不行的。也就是说,仅仅因为 Windows 在 Mac 上关闭而不释放它们是很常见的。如果您认为它们将再次打开,您通常应该保留它们以避免重新加载它们的成本。

有两种思想流派NSWindow:拥有的和无拥有的。我属于“拥有”思想流派。我通常给每个窗口一个所有者,用 ivar 保留它并在适当的时候释放它。通常这是委托,有时是应用程序控制器。在-windowShouldClose:,我发送-autorelease到窗口并将指针设置为零,以便稍后重新创建窗口。这与您引用的技术类似,尽管是否使用+sharedController因为控制器不相关;无论您是否有共享控制器,您都可以执行此操作。

无主学派的思想是使用 NSWindow 的-setReleasedWhenClosed:以便它在关闭时自动释放。我相信您引用的几个窗口在系统提供时都会这样做,因为可能没有委托。这在某些类型的面板中可能很有用,但我会小心地将其作为一般模式。几乎在所有情况下最好都进行显式内存管理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

非模态 Windows 内存管理 的相关文章

  • 如何在 IntelliJ IDEA 中构建 OS X Java 应用程序包?

    我正在尝试在 IntelliJ IDEA 中为 mac 构建一个 Java 应用程序 苹果开发者文档说我需要做一个Java 应用程序包 http developer apple com library mac documentation J
  • 在 Mac OS X 上升级 Ruby

    我正在阅读 Programming Ruby 一书 并希望升级我计算机上的 Ruby 版本 我运行 Mac OS X Snow Leopard 并在命令行中执行 ruby v 显示我正在运行 Ruby 1 8 7 我安装了 MacPorts
  • 以编程方式更改分辨率 OS X

    我的问题很简单 我正在开发一款游戏 正如标题所述 我希望能够以编程方式更改 OS X 上的显示分辨率 刷新率 我已经搜索了几个小时 但找不到任何东西 我已经知道如何创建全屏窗口 我还想获取支持的分辨率和刷新率的列表 来自苹果的适用于 Mac
  • OSX - 将 gcc 版本 4.2.1 替换为通过 Homebrew 安装的 4.9

    这已经困扰我一段时间了 我正在尝试编译一个巨大的 C 文件 我知道它可以工作 因为它在我工作的 Arch Linux 计算机上工作得很好 当我在 mac 上检查 GCC 版本时 它返回以下内容 Configured with prefix
  • 在 Mac 上使用 Homebrew 安装 PHP

    我正在尝试使用 Homebrew 在我的 Mac 计算机上安装 PHP 我正在使用以下命令 brew install php 但是 我收到以下错误 Error No available formula with the name php g
  • 如何在 Swift 中使用 AXObserverAddNotification?

    如何在 Swift 中使用 AXObserverAddNotification 来检测 UI 更改 Obj C 中有一个很好的答案 我的应用程序如何检测另一个应用程序窗口的更改 https stackoverflow com questio
  • VBA cDate 无法在 Mac excel 2011(14.7.1) 上运行

    我正在尝试使用 VBA 脚本将日期转换为长日期 下面是代码片段 Sub test Dim str as string Dim d as variant str 1 1 2016 d cdate str end sub 上面的代码片段在 Wi
  • 如何判断输入来自哪个键盘

    设想 我有一个 USB RFID 读取器 将其连接到笔记本电脑后 它可以用作新连接的 USB 键盘 例如无需安装任何驱动程序 当接触带有 RFID 标签的阅读器时 它进入我当前的窗口 例如终端 外壳 RFID 号码 例如0009339384
  • 加载前检查 OSX 包的签名

    目标 加载已验证已签名 或针对任意算法进行验证 的 so bundle 我希望能够使用 OSX 的内置二进制签名工具或某些自定义算法来验证 so bundle 然后使用 dlopen 加载该 so bundle 问题在于似乎没有编程方式来检
  • 是什么导致 Xamarin Forms 构建上出现“无法识别的选择器发送到类”错误?

    首先是关于我的系统的一些事情 Mac 操作系统版本 10 13 6 Xcode 版本 10 Visual Studio for Mac 7 6 6 我对 Xamarin 表单完全陌生 想要尝试和学习 我想做的只是创建一个新的 xamarin
  • 创建 DOMElement Objective C 的位图

    我有一个 Webkit DOMElement 例如一个 div 现在我想要它的渲染 NSImage 或 NSBitmapImageRep 它就像 DOMElement 的屏幕截图 公共 API 选择 NSView cacheDisplayI
  • Mac 上的 FFMPEG 和 PHP 不起作用

    我需要你的帮助 目前我使用 Mac OS X 10 9 4 和 xampp apache 1 8 3 3 我需要使用ffmpeg 版本3 2 通过php转换视频文件exec 但我无法让它发挥作用 我做了一些运行终端命令行的测试 系统运行正常
  • DropDelegate Safari 拖动图像

    我正在尝试实施DropDelegate模式以允许将图像拖到我的视图中并加载它们 这对于取景器中的图像效果很好 但是当将图像从 safari 拖到我的视图中时 这不起作用 我注意到typeIdentifier or UTType所提供的信息
  • 以编程方式更改 mac osx 上的代理

    如何以编程方式更改 mac osx 上的代理设置 我对ios很流利 而且由于mac os编程类似 所以应该不会有太多问题 然而 我缺乏以编程方式创建代理更改所需的逻辑 手动调整非常容易 这是我所追求的系统偏好设置中的网络选项卡 我尝试过的
  • RVM 安装问题 - 无法执行端口 (autoconf)

    我正在尝试在 OSX mountain lion 上安装 Jekyll 首先我想安装RVM 然后安装最新的ruby 但是 RVM 安装失败 我无法解决问题 任何帮助表示赞赏 这是我所做的 安装的 OSX 命令行工具 尝试安装 RVM cur
  • NSPredicateEditor 行模板不可在界面生成器中配置

    我正在界面生成器的故事板中创建一个辅助表 viewController 包含一个NSPredicateEditor并使用 cocoa 绑定连接到 viewController 的属性 但是 我无法正确配置行模板 当我取消选中其中一个谓词运算
  • 我可以在 Mac OS X 上将 enthought python 重新链接到新版本的 openssl 吗?

    今天早上 我在 Mac OS X 10 6 8 上使用 EPD 7 3 时遇到了与 SSL 相关的问题 当我运行 pip 版本 1 3 1 时 我得到 pip install requests Downloading unpacking r
  • 在 MACOSX 上找不到“Python.h”文件,如何解决这个问题?

    pip3 安装 PyAudio 0 2 12默认为用户安装 因为普通站点包不可写 收集PyAudio 0 2 12 使用缓存的 PyAudio 0 2 12 tar gz 42 kB 安装构建依赖项 完成 获取建造轮子的要求 完成 准备元数
  • 如果您查看内部,nib 文件到底是什么样子的?

    我刚刚学习 nibs 和 swift 并对某些东西感到好奇 我知道 如果您有一个 main storyboard 文件 则首先加载根视图控制器的笔尖 然后加载该视图控制器下可能分层存在的任何视图 但是 我想知道一些事情 当他们说笔尖已 加载
  • 如何在 mac yosemite 上撤消“brew link --force openssl”

    我在尝试使用 php54 升级酿造公式时遇到了一些问题 我在github上找到了一些解决这个问题的建议openssl php 酿造错误 https github com Homebrew homebrew php issues 1181 其

随机推荐